如何通过Scala Reader从Java代码注入依赖关系 [英] How to inject dependencies through Scala Reader from Java code

查看:140
本文介绍了如何通过Scala Reader从Java代码注入依赖关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个依赖服务:

  public class Service1 {}

通过阅读器使用它的标量代码:

Scala code that uses it via reader:

object TupleEx {
  type FailFast[A] = Either[List[String], A]
  type Env[A] = ReaderT[FailFast, Service1, A]

  import cats.syntax.applicative._
  import cats.instances.either._

  def f:Env[Int] = 10.pure[Env]
}

我尝试在其中注入Service1的Java测试:

Java test where I try to inject Service1:

  @Test
  public void testf() {
    Service1 s = new Service1();
    TupleEx.f().run(s);
  }

我遇到一个例外:

错误:(10,16)java:在cats.data.Kleisli类中运行的方法 不能应用于给定类型;必需:未找到参数: com.savdev.Service1原因:实际参数和形式参数列表不同 长度

Error:(10, 16) java: method run in class cats.data.Kleisli cannot be applied to given types; required: no arguments found: com.savdev.Service1 reason: actual and formal argument lists differ in length

尽管在Scala中,我仍可以将其运行为:

Although in Scala I would be able to run it as:

TupleEx.f().run(s);

推荐答案

尝试:

TupleEx.f().run().apply(s);

  • run()Kleisli
  • val的获取"方法
  • apply()是Scala的语法糖通常隐藏的内容
    • run() is the "getter" method of the val inside Kleisli
    • apply() is what is usually hidden by Scala's syntactic sugar
    • 一般建议:

      1. 编写Java接口
      2. 在Scala中实现界面
      3. 使用Java编写代码时,请使用仅通过Java接口编写的内容.
      4. 在用Java编写代码时,请勿尝试直接使用Scala接口.

      请记住:Scala编译器了解Java. Java对Scala一无所知.在Scala中实现Java接口很简单.从Java使用Scala接口很尴尬.

      Remember: Scala compiler understands Java. Java does not know anything about Scala. Implementing Java interfaces in Scala is trivial. Using Scala interfaces from Java is awkward.

      这篇关于如何通过Scala Reader从Java代码注入依赖关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆