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

3

这里有一个依赖服务:

  public class Service1 {}

使用读取器的 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);
  }

我遇到了一个异常:

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

虽然在Scala中,我可以像这样运行它:

TupleEx.f().run(s);
1个回答

4

尝试:

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

一般建议:

  1. 在 Java 中编写一个接口
  2. 在 Scala 中实现该接口
  3. 在使用 Java 编写代码时,只通过 Java 接口使用所编写的内容
  4. 不要尝试在使用 Java 编写代码时直接使用 Scala 接口。

请记住:Scala 编译器可以理解 Java,但 Java 对 Scala 一无所知。在 Scala 中实现 Java 接口很简单,但在 Java 中使用 Scala 接口则比较麻烦。


1
是的,它有效。我稍微简化了一下:TupleEx.f().apply(s)。'run' 不是必要的。 - Alexandr
1
@Alexandr 啊,确实,Kleisli 覆盖了 apply,只是将其重定向到 run - Andrey Tyukin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接