Scala删除通用类型信息

时间:2015-10-20 17:21:21

标签: java scala generics scala-collections scalac

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

def foo(x:List[Long]) = ...  

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

相同
def foo(x:java.util.List[Long]) = ...  
<。> .class文件说方法签名是
Ljava/util/List<Ljava/lang/Object;>

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

我正在使用scala版本2.11.7

1 个答案:

答案 0 :(得分:5)

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

为什么呢?好吧,scala.Long相当于Java long,而不是Java java.lang.Long。在Java类型系统中,类型参数可能不是指原始类型,而是仅引用类型。所以Scala无法发出&#34;正确&#34;签名并被迫退回java.lang.Object

(在Scala的旧版本中,它过去常常回退到java.lang.Long,但不幸的是,这实际上并不是100%正确的解决方案,并导致一堆互操作问题。请参阅{{3对于血腥的细节。不幸的是,我不知道更简洁的写作。这经常出现,所以如果有这样的写作,我想知道它。)