在 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!
}
我要问一个单独的问题...