在Java中,我可能会这样做:
class MyClass {
private List<? extends MyInterface> list;
public void setList(List<MyImpl> l) { list = l; }
}
当然是...assuming (MyImpl implements MyInterface
)。
在使用Buffer
时,在Scala中与此类似的是什么
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!
}
我要问一个单独的问题。
发布于 2009-03-23 14:03:33
直接模拟到
import java.util.List;
List<? extends MyInterface> list;
是
import java.util.List
var list : List[_ <: MyInterface] = _;
与Buffer的处理相同
为了回答你之前的评论,在Java中,类型参数总是不变的,而不是协变的。
https://stackoverflow.com/questions/663032
复制相似问题