如何通过Scala Reader从Java代码注入依赖关系 [英] How to inject dependencies through Scala Reader from Java code
问题描述
这是一个依赖服务:
public class Service1 {}
通过阅读器使用它的标量代码:
Scala code that uses it via reader:
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]
}
我尝试在其中注入Service1的Java测试:
Java test where I try to inject Service1:
@Test
public void testf() {
Service1 s = new Service1();
TupleEx.f().run(s);
}
我遇到一个例外:
错误:(10,16)java:在cats.data.Kleisli类中运行的方法 不能应用于给定类型;必需:未找到参数: com.savdev.Service1原因:实际参数和形式参数列表不同 长度
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中,我仍可以将其运行为:
Although in Scala I would be able to run it as:
TupleEx.f().run(s);
推荐答案
尝试:
TupleEx.f().run().apply(s);
-
run()
是Kleisli
中 -
apply()
是Scala的语法糖通常隐藏的内容 run()
is the "getter" method of theval
insideKleisli
apply()
is what is usually hidden by Scala's syntactic sugar- 编写Java接口
- 在Scala中实现界面
- 使用Java编写代码时,请使用仅通过Java接口编写的内容.
- 在用Java编写代码时,请勿尝试直接使用Scala接口.
val
的获取"方法
一般建议:
请记住:Scala编译器了解Java. Java对Scala一无所知.在Scala中实现Java接口很简单.从Java使用Scala接口很尴尬.
Remember: Scala compiler understands Java. Java does not know anything about Scala. Implementing Java interfaces in Scala is trivial. Using Scala interfaces from Java is awkward.
这篇关于如何通过Scala Reader从Java代码注入依赖关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!