如何从 Java 代码通过 Scala Reader 注入依赖项

How to inject dependencies through Scala Reader from Java code

这里是一个依赖服务:

  public class Service1 {}

通过 reader 使用它的 Scala 代码:

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]
}

Java 测试我尝试注入 Service1 的位置:

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

我遇到异常:

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 中我可以运行它作为:

TupleEx.f().run(s);

尝试:

TupleEx.f().run().apply(s);
  • run()Kleisli
  • 里面的val的"getter"方法
  • apply() 通常被 Scala 的语法糖
  • 隐藏

一般建议:

  1. 在Java
  2. 中写下一个接口
  3. 在 Scala 中实现接口
  4. 在 Java.
  5. 中编写代码时,仅使用通过 Java 接口编写的任何内容
  6. 在Java中编写代码时不要尝试直接使用 Scala 接口。

记住:Scala 编译器理解 Java。 Java 对 Scala 一无所知。在 Scala 中实现 Java 接口很简单。使用来自 Java 的 Scala 接口很尴尬。