如何通过Java中的Scala通过包对象传递定义的隐式val
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何通过Java中的Scala通过包对象传递定义的隐式val,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2274字,纯文字阅读大概需要4分钟。
内容图文
我正在使用Cats库.在Scala中,代码如下所示:
import cats.Semigroupal
import cats.instances.option._
val r = Semigroupal.tuple2(Option(1), Option(2))
元组2定义为:
def tuple2[F[_], A0, A1](f0:F[A0], f1:F[A1])(implicit semigroupal: Semigroupal[F], invariant: Invariant[F]):F[(A0, A1)]
实际上,以下隐式值既作为Semigroupal又作为Invariant传递(通过Intellij IDEA插件对Scala进行检查):
package cats
package instances
trait OptionInstances ...
implicit val catsStdInstancesForOption: ...
如何通过Java代码在tuple2函数中传递catsStdInstancesForOption?
Semigroupal$.MODULE$.tuple2(
Option.apply(1), Option.apply(2),
...,// and here?
... //here
);
依赖Cats库(如果需要):
<cats.core.version>1.5.0</cats.core.version>
...
<!-- https://mvnrepository.com/artifact/org.typelevel/cats-core -->
<dependency>
<groupId>org.typelevel</groupId>
<artifactId>cats-core_2.12</artifactId>
<version>${cats.core.version}</version>
</dependency>
解决方法:
引用从Java的包对象内部定义的Scala对象是一件很痛苦的事,据我所知,没有充分的理由-完全是因为编译器决定修改名称的方式(例如,您不能直接引用cats .instances.package $option $(来自Java).
我以前想做这种事情,而我找到的最佳解决方案是这样的:
import cats.Apply;
import cats.Semigroupal$;
import cats.instances.OptionInstances;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import scala.Option;
import scala.Tuple2;
public class Test {
public static Apply<Option> getOptionInstance() {
try {
Class<?> cls = Class.forName("cats.instances.package$option$");
Field f = cls.getField("MODULE$");
Method m = f.getType().getMethod("catsStdInstancesForOption");
return (Apply<Option>) m.invoke(f.get(null));
} catch (Exception e) {
// Shouldn't happen but do something here anyway.
return null;
}
}
public static void main(String[] args) {
Apply<Option> optionInstance = getOptionInstance();
Option<Tuple2<Integer, Integer>> pair = Semigroupal$.MODULE$.tuple2(
Option.apply(1),
Option.apply(2),
optionInstance,
optionInstance
);
System.out.println(pair);
}
}
太糟糕了,但是至少反射和投射被捆绑在一个地方.
如果您有很多需要从Java使用的实例,则可以从getOptionInstance中提取一些逻辑以减少重复,但这仍然不会很有趣.如果您可以在Scala端编写一些实用程序代码以从Java使用,那么制作一个对Java更友好的cat.instances并不难,只是不要使用包对象等.(为此我值得希望Cats在开发Java时更加关注Java友好性,但据我所知,没有人关心它.)
内容总结
以上是互联网集市为您收集整理的如何通过Java中的Scala通过包对象传递定义的隐式val全部内容,希望文章能够帮你解决如何通过Java中的Scala通过包对象传递定义的隐式val所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。