我有一个实现Java接口的特性
Java界面:
public interface Scheme extends Serializable {
List<Object> deserialize(ByteBuffer var1);
Fields getOutputFields();
}
Scala特质:
trait JSONScheme extends Scheme {
type Event <: AnyRef
override def deserialize(bytes: ByteBuffer): util.List[Event] = {
val v: Seq[Event] = parseData(bytes)
v.asJava
}
}
问题是为什么这不起作用,因为Event
类型被定义为由AnyRef
限定?这失败了:
Error:(35, 16) overriding method deserialize in trait Scheme of type (x$1: java.nio.ByteBuffer)java.util.List[Object];
method deserialize has incompatible type
override def deserialize(bytes: ByteBuffer): util.List[Event] = {
如果我重写代码以手动将Event
添加到Java集合中,它可以正常工作。
override def deserialize(bytes: ByteBuffer): util.List[AnyRef] = {
val v: Seq[Event] = parseData(bytes)
val vArray = new util.ArrayList[AnyRef]()
v.map(vArray.add(_))
vArray
}
答案 0 :(得分:6)
Java列表在其元素类型中是不变的,因此List[Event]
不是List[Object]
的子类,这使得您的方法不兼容:它的返回类型必须是子类的被重写方法的返回类型。
您的第二个代码段不起作用,因为您&#34;手动添加Event
&#34;,但因为声明该方法返回List[AnyRef]
而不是List[Event]
。