【发布时间】:2009-03-19 16:54:12
【问题描述】:
在 Java 中我可能会这样做:
class MyClass {
private List<? extends MyInterface> list;
public void setList(List<MyImpl> l) { list = l; }
}
...当然是假设 (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!
}
我要问一个单独的问题...
【问题讨论】:
-
这个问题是否已经回答或仍然开放?
-
我没注意到你的回答,因为我在这之后不久就去度假了。对不起。我很确定我已经读过“Scala 中没有通配符”。曾经有过这种情况吗?我想现在不是……
标签: java generics scala covariance contravariance