19

Javaではこれを行うかもしれません:

class MyClass {
    private List<? extends MyInterface> list;

    public void setList(List<MyImpl> l) { list = l; }
}

MyImpl implements MyInterface...もちろん()と仮定します。

Scalaでこれを使用する場合のアナログは何Bufferですか?

import java.lang.reflect._
import scala.collection.mutable._

class ScalaClass {
   val list:Buffer[MyInterface]  = null

   def setList(l: Buffer[MyImpl]) = {
     list = l
   }
}

これは(もちろん)コンパイルされませんが、どのようにすると、そのlistように変数を宣言できますか?

編集; もう少し追加します。違いは明らかに、JavaではジェネリックはTで共変ではないのに対し、Scalaでは共変であるかどうかに関係しているという事実と関係があります。たとえば、ScalaクラスListはTで共変です(そして必然的に不変です)。したがって、以下がコンパイルされます。

class ScalaClass {
   val list:List[MyInterface]  = null

   def setList(l: List[MyImpl]) = {
     list = l
   }
}

私はまだコンパイラエラーに少し苦労しています:

Covariant type T occurs in contravariant position in ...

例えば; このコンパイラエラーは、クラス宣言で発生します。

class Wibble[+T] {
  var some: T = _ //COMPILER ERROR HERE!
 }

別の質問をします...

4

1 に答える 1

44

直接アナログ

import java.util.List;
List<? extends MyInterface> list;

import java.util.List
var list : List[_ <: MyInterface]  = _;

バッファと同じ取引

あなたが以前に作成したコメントに答えるために、Javaでは、型パラメータは常に不変であり、共変ではありません。

于 2009-03-23T14:03:33.483 に答える