这是一个依赖服务:
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);
尝试:
TupleEx.f().run().apply(s);
run()
是val
内Kleisli
的“吸气剂”方法apply()
是斯卡拉的句法糖通常隐藏的东西一般建议:
请记住:Scala编译器了解Java。 Java对Scala一无所知。在Scala中实现Java接口是微不足道的。使用Java的Scala接口很尴尬。