如何将混合类型的 scala higher-kinder 类型特征与 java 泛型匹配?

how match mixed type of scala higher-kinder types feature with java generic type?

我的项目混合了java和scala语言,但是出现了一些类型不匹配的错误,我认为这是java和scala通信的常见问题。 我用简单的 classes 组织了舞台。环境是 java 1.8 和 scala 2.11.7

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 class 就这么简单:

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)  
                  ^

任何帮助或建议谢谢。

In other word, how does the java represent scala's Packet[Item[_]] type?

没有。 Java 根本就没有 higher-kinded 类型。 MM是higher-kinded的信息隐藏在@ScalaSignature.

里面

当你写 Packet<Item> 时,你使用的是 raw type(反过来,它不能在 Scala 中表示);你不能在 newPacketInJava.

中使用 Item<Something>