Java Scala正在删除泛型类型信息
我有一个scala项目正在生成一个jar。我试图在Java项目中使用jar。奇怪的是,当方法签名被编译到.class文件时,它们正在丢失泛型类型信息Java Scala正在删除泛型类型信息,java,scala,generics,scala-collections,scalac,Java,Scala,Generics,Scala Collections,Scalac,我有一个scala项目正在生成一个jar。我试图在Java项目中使用jar。奇怪的是,当方法签名被编译到.class文件时,它们正在丢失泛型类型信息 def foo(x:List[Long]) = ... 生成具有 Lscala/collection/immutable/List 在其.class文件中 对我来说也是 def foo(x:java.util.List[Long]) = ... .class文件表示方法签名是 Ljava/util/List 真正的问题是,当我在Java
def foo(x:List[Long]) = ...
生成具有Lscala/collection/immutable/List
在其.class文件中 对我来说也是
def foo(x:java.util.List[Long]) = ...
.class文件表示方法签名是Ljava/util/List
真正的问题是,当我在Java项目中使用这个jar时,我必须使用List
,而不是我想要的List
。当然我可以投,但我宁愿不投。有什么想法吗
我使用的是scala 2.11.7版如果您希望您的方法能够以您想要的方式从Java调用,则必须声明它采用
列表[Java.lang.Long]
为什么??嗯,scala.Long
相当于Java的Long
,而不是Java的Java.lang.Long
。在Java类型系统中,类型参数可能不引用基元类型,而只引用类型。因此Scala无法发出“正确”的签名,被迫退回到java.lang.Object
(在非常旧的Scala版本中,它通常会退回到
java.lang.Long
,但不幸的是,这实际上不是一个100%正确的解决方案,并导致了一系列互操作问题。请参阅以获取大量详细信息。不幸的是,我不知道有更简洁的writeup。这种情况经常出现,因此如果有这样的writeup,我想使用它。)当然了!谢谢你!考虑使用<代码>数组[Loo]< /Cord>是个好主意,因为这将在爪哇被翻译成代码>长[] /Cord>。当然不总是可能的,但是它使java和Scala看起来都很好,没有丑陋的签名。