Scala删除通用类型信息

Tim*_*Tim 2 java generics scala scalac scala-collections

我有一个生成jar的scala项目.我正在尝试在Java项目中使用jar.奇怪的是,当签名编译为.class文件时,签名正在丢失泛型类型信息.

def foo(x:List[Long]) = ...  
Run Code Online (Sandbox Code Playgroud)


Lscala/collection/immutable/List<Ljava/lang/Object;>
在.class文件中生成一个方法.

它也一样

def foo(x:java.util.List[Long]) = ...  
Run Code Online (Sandbox Code Playgroud)

.class文件说方法签名是
Ljava/util/List<Ljava/lang/Object;>

真正的问题是,当我在Java项目中使用这个jar时,我必须使用List<Object>而不是List<Long>我想要的.当然我可以施展它,但我宁愿不必.有任何想法吗?

我使用scala版本2.11.7

Set*_*sue 5

如果您希望以您希望的方式从Java调用您的方法,则必须将其声明为a List[java.lang.Long].

为什么?嗯,scala.Long相当于Java long,而不是Java java.lang.Long.在Java类型系统中,类型参数可能不是指原始类型,而是仅引用类型.因此Scala无法发出"正确"的签名,并被迫退回java.lang.Object.

(在非常旧版本的Scala中,它过去常常回归java.lang.Long,但不幸的是,这实际上并不是100%正确的解决方案,并导致一堆互操作问题.请参阅https://issues.scala-lang.org/browse/SI-4214 for gory details.不幸的是,我不知道更简洁的写法.这经常出现,所以如果有这样的写作,我想知道它.)