java - 从 Java 代码访问 Scala 类型类?

标签 java scala typeclass implicit

我使用类型类和临时多态性在 Scala 中创建了许多不同的拍卖实现。

可以找到 Scala 实现的示例 here .

在 Scala 中创建一个拍卖实例如下...

val google: GoogleStock = GoogleStock(tick=1)
val pricingRule = new MidPointPricingPolicy[GoogleStock]
val withDiscriminatoryPricing = OpenBidDoubleAuction.withDiscriminatoryPricing(pricingRule)

我希望用户能够从 Java 8 访问拍卖实现。

但我似乎无法弄清楚如何在 Java 中创建拍卖实例。采用这种方法:

MidPointPricingPolicy<GoogleStock> midPointPricing = new MidPointPricingPolicy<GoogleStock>();
OpenBidDoubleAuction.DiscriminatoryPricingImpl<GoogleStock> auction = OpenBidDoubleAuction$.MODULE$.withDiscriminatoryPricing(midPointPricing);

有效,但没有任何类型类契约方法可用。具体来说:

OpenBidDoubleAuction.DiscriminatoryPricingImpl<GoogleStock> auction2 = auction.insert(order3);

...产生以下编译错误。

Error:(90, 82) java: cannot find symbol
symbol:   method insert(org.economicsl.auctions.singleunit.orders.LimitAskOrder<org.economicsl.auctions.GoogleStock>)
location: variable auction of type org.economicsl.auctions.singleunit.twosided.SealedBidDoubleAuction.UniformPricingImpl<org.economicsl.auctions.GoogleStock>

似乎在编译 Java 代码时,Scala 编译器为类型类生成的契约方法不可用。在我的 build.sbt 文件中,我设置了 compileOrder := CompileOrder.ScalaThenJava 以确保首先编译这些 Scala,以便这些方法可用。

根据@GhostCat 的建议,我使用 javap 发现 Scala 编译器生成了以下 .class 文件...

OpenBidDoubleAuction$DiscriminatoryPricingImpl$$anon$1.class

其中包含相关方法的字节码定义。

所以我想我需要知道如何从 Java 访问此字节代码文件中定义的内容?有可能吗?

最佳答案

一般的答案是:那是两种不同的语言。在 Java 端唯一可见的是在 OpenBidDoubleAuction字节码中找到的元素。

因此:一种可能的方式让您了解“我可以从 Java 中使用什么”:转向 javap并检查由 scalac 生成的字节码。这将告诉您所有可用的方法及其签名。如果你发现你的“增强”示例太复杂了:退后一步。创建一个最小示例——一小块scala;然后仔分割析生成的字节码。

当然:您首先检查 documentation - 您想避免将时间浪费在根本不可能的事情上。有多种语言元素是您无法从 Java 方面使用的。

(请注意:该链接已过时,但可能足以作为您自己研究的起点)

关于java - 从 Java 代码访问 Scala 类型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44104882/

相关文章:

java - Tomcat 替换 VM 参数

java - JDK 8 在类路径中不可用

json - Play Json 递归读取

scala:运行一个 play-slick 示例导致导入错误

haskell - 在 Haskell 中使用类型类访问相似数据类型的字段

haskell - 如何为自由幺半群定义父类(super class)约束?

java - Spring Boot 项目中的作业调度库

Java 库正在覆盖 log4j.properties

scala - opencv 3.0.0 java imread_0 未定义

Java 接口(interface)和 Haskell 类型类 : differences and similarities?