Scala 中变量声明中的泛型通配符
2022-09-02 11:53:07
在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 类在 T 中是协变的(并且必然是不可变的)。因此,将编译以下内容:List
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!
}
我要问一个单独的问题...