我有一个生成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
答案 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对于血腥的细节。不幸的是,我不知道更简洁的写作。这经常出现,所以如果有这样的写作,我想知道它。)