在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!
}
我要问一个单独的问题......
答案 0 :(得分:41)
直接模拟
import java.util.List;
List<? extends MyInterface> list;
是
import java.util.List
var list : List[_ <: MyInterface] = _;
与缓冲区相同的处理
要回答您做出的评论,在Java类型参数中始终是不变的,而不是协变的。
答案 1 :(得分:-1)
我根本不确定你理解你的问题(我可能没有足够的咖啡),但听起来你问的是generic classes。如果不是这样,请发表评论或在问题中添加更多信息。我稍后会回来查看。编辑我的答案。