如何从 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 的语法糖 隐藏
一般建议:
- 在Java
中写下一个接口
- 在 Scala 中实现接口
- 在 Java.
中编写代码时,仅使用通过 Java 接口编写的任何内容
- 在Java中编写代码时不要尝试直接使用 Scala 接口。
记住:Scala 编译器理解 Java。 Java 对 Scala 一无所知。在 Scala 中实现 Java 接口很简单。使用来自 Java 的 Scala 接口很尴尬。
这里是一个依赖服务:
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
里面的apply()
通常被 Scala 的语法糖 隐藏
val
的"getter"方法
一般建议:
- 在Java 中写下一个接口
- 在 Scala 中实现接口
- 在 Java. 中编写代码时,仅使用通过 Java 接口编写的任何内容
- 在Java中编写代码时不要尝试直接使用 Scala 接口。
记住:Scala 编译器理解 Java。 Java 对 Scala 一无所知。在 Scala 中实现 Java 接口很简单。使用来自 Java 的 Scala 接口很尴尬。