从Java代码访问Scala类型类?

从Java代码访问Scala类型类?,java,scala,typeclass,implicit,Java,Scala,Typeclass,Implicit,我使用类型类和特殊多态性在Scala中创建了许多不同的拍卖实现 可以找到Scala实现的示例 在Scala中,one将创建此拍卖的一个实例,如下所示 val google: GoogleStock = GoogleStock(tick=1) val pricingRule = new MidPointPricingPolicy[GoogleStock] val withDiscriminatoryPricing = OpenBidDoubleAuction.withDiscriminatoryP

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

可以找到Scala实现的示例

在Scala中,one将创建此拍卖的一个实例,如下所示

val google: GoogleStock = GoogleStock(tick=1)
val pricingRule = new MidPointPricingPolicy[GoogleStock]
val withDiscriminatoryPricing = OpenBidDoubleAuction.withDiscriminatoryPricing(pricingRule)
我希望用户能够从Java8访问拍卖实现

但我似乎不知道如何用Java创建拍卖实例。采取这种做法:

MidPointPricingPolicy<GoogleStock> midPointPricing = new MidPointPricingPolicy<GoogleStock>();
OpenBidDoubleAuction.DiscriminatoryPricingImpl<GoogleStock> auction = OpenBidDoubleAuction$.MODULE$.withDiscriminatoryPricing(midPointPricing);
其中包含相关方法的字节码定义


所以我想我需要知道如何从Java访问这个字节码文件中定义的东西?有可能吗

一般的答案是:这是两种不同的语言。java端唯一可见的是
OpenBidDoubleAuction
字节码中的元素

因此,您可以通过一种潜在的方式来理解“我可以从Java使用什么”:查看并检查scalac生成的字节码。这将告诉您所有可用的方法及其签名。如果您发现您的“增强”示例过于复杂,请后退一步。创建一个最小的示例-一小块scala;然后仔细分析生成的字节码

当然,你首先要检查一下——你想避免把时间浪费在一些根本不可能的事情上。从Java方面看,有各种语言元素是无法使用的


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

一般答案是:这是两种不同的语言。java端唯一可见的是
OpenBidDoubleAuction
字节码中的元素

因此,您可以通过一种潜在的方式来理解“我可以从Java使用什么”:查看并检查scalac生成的字节码。这将告诉您所有可用的方法及其签名。如果您发现您的“增强”示例过于复杂,请后退一步。创建一个最小的示例-一小块scala;然后仔细分析生成的字节码

当然,你首先要检查一下——你想避免把时间浪费在一些根本不可能的事情上。从Java方面看,有各种语言元素是无法使用的


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

Java没有
implicit
关键字,对implicit一无所知。Java的
隐式def
只是另一种方法。因此,当您从Java调用此代码时,必须显式添加所有隐式转换和隐式参数。如果您想知道它是什么样子,可以打开一个Scala REPL,并使用
//print
提示查看经过几次去语法化并显式化后的代码

例如,给定一些类型类
Foo
和隐式
FooSyntax

scala> 42.foo //print <tab>
   FooSyntax[Int](42)(Foo.fooInt).foo // : String
如果你运气不好,你可能不得不添加一些额外的
模块$
东西。如果您更不幸运,并且必须与结构类型或交集类型等进行互操作,那么您可能必须分别使用反射或强制转换


但一般来说:如果您想从Java调用相同的代码,请不要使用Scala的高级功能,如TypeClass。如果您必须创建一个可从Java调用的库,那么请尝试(在Scala中)围绕高级/不兼容的部分编写Java友好的包装。

Java没有
implicit
关键字,也不知道隐式。Java的
隐式def
只是另一种方法。因此,当您从Java调用此代码时,必须显式添加所有隐式转换和隐式参数。如果您想知道它是什么样子,可以打开一个Scala REPL,并使用
//print
提示查看经过几次去语法化并显式化后的代码

例如,给定一些类型类
Foo
和隐式
FooSyntax

scala> 42.foo //print <tab>
   FooSyntax[Int](42)(Foo.fooInt).foo // : String
如果你运气不好,你可能不得不添加一些额外的
模块$
东西。如果您更不幸运,并且必须与结构类型或交集类型等进行互操作,那么您可能必须分别使用反射或强制转换


但一般来说:如果您想从Java调用相同的代码,请不要使用Scala的高级功能,如TypeClass。如果您必须创建一个可从Java调用的库,那么请尝试(在Scala中)围绕高级/不兼容部分编写Java友好的包装器。

谢谢。你知道在字节码中寻找什么吗?在这种情况下,Scala编译器是否生成特定的样板文件?也许编译器生成了一个包含这些方法的匿名类?并且只是为了记录:如果您解决了这个难题,那么给出一个自我回答总是可以的(那么请给我一个注释,我自己也很好奇)。我目前提出的“解决方案”是围绕Scala代码创建Java包装器。如果您感兴趣,可以查看详细信息(向下滚动至底部以查找相关位)。包装被称为
JOpenBidDoubleAuction
(或类似产品)。谢谢。你知道在字节码中寻找什么吗?在这种情况下,Scala编译器是否生成特定的样板文件?也许编译器生成了一个包含这些方法的匿名类?并且只是为了记录:如果您解决了这个难题,那么给出一个自我回答总是可以的(那么请给我一个注释,我自己也很好奇)。我目前提出的“解决方案”是围绕Scala代码创建Java包装器。D
OpenBidDoubleAuction$DiscriminatoryPricingImpl$$anon$1.class
scala> 42.foo //print <tab>
   FooSyntax[Int](42)(Foo.fooInt).foo // : String
FooSyntax(42, Foo.fooInt()).foo();