2015-12-31 48 views
1

我的项目是混合java和scala语言,但会发生一些类型不匹配错误,我认为这是java和scala通信方面的常见问题。 我用简单的课程组织了舞台。环境是java的1.8和Scala 2.11.7如何匹配java类型的scala高级类型的混合类型?

class Item[+T](name: String) 

//ready use Item as MM type 
class Packet[+MM[_]] 

object GenS extends App { 
    //use Item class 
    def doWithPacket(packet: Packet[Item]) = {} 

    //type error occur on packetFormJava variable form java 
    val packetFormJava = GetGenJ.newPacketInJava 
    doWithPacket(packetFormJava) 

    //run well 
    val packetFromScala = new Packet[Item] 
    doWithPacket(packetFromScala) 
} 

和Java类这样简单:

public class GetGenJ { 
    public static Packet<Item> newPacketInJava() { 
     return new Packet<Item>(); 
    } 
} 

编译错误的邂逅:

Error:(16, 16) type mismatch; 
found : Packet[Item[_]] 
required: Packet[Item] 
    doWithPacket(packetFormJava) 
       ^

任何帮助或建议表示感谢。

+0

换句话说,java如何表示scala的Packet [Item [_]]类型? – LoranceChen

+0

在Scala中添加实用方法的一个选项?这可能是最简单的解决方案。我不确定你可以在Java中表示更高级别的类型。 –

+0

hi @ 0__,Item [_]应该表示Java中较高类型的类型。看来我可能会避免Java代码返回一个更高的类型。谢谢反正 – LoranceChen

回答

1

换句话说,java如何表示scala的Packet [Item [_]]类型?

它没有。 Java根本没有更高级的类型。 MM更高的信息隐藏在@ScalaSignature的内部。

当您编写Packet<Item>时,您使用的是raw type(反过来,它不能在Scala中表示)。您不能在newPacketInJava内使用Item<Something>

+0

谢谢,我会避免做java中的高级类型。关于原始类型的讨论似乎是一个遗留问题。喜欢新的一年〜 – LoranceChen