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!
}
別の質問をします...