2017-06-08 13 views
0

私はJavaインターフェイス方法は、互換性のないタイプ

Javaインタフェースを実装して形質を持ってい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] = { 

私は、コードは、Javaコレクションに手動でEventを追加するために書き換える場合は、それが正常に動作します。

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 
} 

答えて

6

のJavaリスト、その要素の型で不変であるので、List[Event]List[Object]のサブクラスではありません、そしてそれはあなたの方法は互換性がなくなり:それの戻り値の型は、オーバーライドされたメソッドの戻り値の型のサブクラスでなければなりません。

Eventを手動で追加する」のではなく、List[Event]ではなくList[AnyRef]を返すようにメソッドが宣言されているため、2番目のスニペットは機能しません。

+0

お返事ありがとうございます。 Javaのリストに要素を追加すると、2番目のバージョンで 'Event'型を受け入れる方法は? – jamborta

+1

さて、 'Event'は' AnyRef'のサブクラスであり、それは "Is a ..."の関係です(すべて "dogs"は "animals"、すべての 'Event'sは' AnyRef'sです)。どこでもそれを渡すことができます 'AnyRef'は期待されています。 'Event'を' List [AnyRef] 'に追加することはできますが、' Event'バック(キャストなし)を_get_できません。 'list.get(0)'は 'AnyRef'を返します。これが 'List [Event]'だった場合は、 'Event'となります。 – Dima

+0

意味があります。ありがとう。 – jamborta

関連する問題