方法具有不兼容的类型

时间:2017-06-08 17:07:49

标签: scala

我有一个实现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
}

1 个答案:

答案 0 :(得分:6)

Java列表在其元素类型中是不变的,因此List[Event]不是List[Object]的子类,这使得您的方法不兼容:它的返回类型必须是子类的被重写方法的返回类型。

您的第二个代码段不起作用,因为您&#34;手动添加Event&#34;,但因为声明该方法返回List[AnyRef]而不是List[Event]