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

问题描述 投票:2回答:1

这是一个依赖服务:

  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中运行的方法不能应用于给定的类型; required:找不到参数:com.savdev.Service1 reason:实际和形式参数列表的长度不同

虽然在Scala我可以运行它:

TupleEx.f().run(s);
scala dependency-injection scala-cats scala-java-interop reader-monad
1个回答
4
投票

尝试:

TupleEx.f().run().apply(s);
  • run()valKleisli的“吸气剂”方法
  • apply()是斯卡拉的句法糖通常隐藏的东西

一般建议:

  1. 用Java写下接口
  2. 在Scala中实现接口
  3. 在Java中编写代码时,使用您通过Java接口编写的任何内容。
  4. 在Java中编写代码时,请勿尝试直接使用Scala接口。

请记住:Scala编译器了解Java。 Java对Scala一无所知。在Scala中实现Java接口是微不足道的。使用Java的Scala接口很尴尬。

© www.soinside.com 2019 - 2024. All rights reserved.