如何将Scala高阶类型特征的混合类型与Java泛型类型匹配? [英] how match mixed type of scala higher-kinder types feature with java generic type?
问题描述
我的项目是Java和Scala语言的混合体,但是会出现一些类型不匹配错误,我认为这是Java和Scala交流方面的常见问题. 我用简单的班级安排了舞台.环境是Java 1.8和Scala 2.11.7
my project is mixed java and scala language, but some type mismatch error occur and I think it's a common problem in term of java and scala communicate. I organized the stage with simple classes. Environment is java 1.8 and 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类:
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)
^
任何帮助或建议谢谢.
推荐答案
换句话说,Java如何代表Scala的Packet [Item [_]]类型?
In other word, how does the java represent scala's Packet[Item[_]] type?
不是. Java根本没有更高类型的类型. MM
种类较多的信息隐藏在@ScalaSignature
内部.
It doesn't. Java simply doesn't have higher-kinded types. The information that MM
is higher-kinded is hidden inside @ScalaSignature
.
编写Packet<Item>
时,您使用的是原始类型(因此,在Scala中代表);您不能在newPacketInJava
中使用Item<Something>
.
When you write Packet<Item>
, you are using a raw type (which, in turn, can't be represented in Scala); you couldn't use Item<Something>
inside newPacketInJava
.
这篇关于如何将Scala高阶类型特征的混合类型与Java泛型类型匹配?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!