为什么示例不编译,又如何(共同,反向和反向)方差有效?有人可以在Scala中解释以下内容:class Slot[+T] (var some: T) {
// DOES NOT COMPILE
// "COVARIANT parameter in CONTRAVARIANT position"}我明白之间的区别+T,并T在类型声明(它编译如果我使用T)。但是,如何实际编写一个在其类型参数中具有协变性的类而不依赖于创建未参数化的东西?如何确保只能使用实例创建以下内容T?class Slot[+T] (var some: Object){
def get() = { some.asInstanceOf[T] }}
3 回答
largeQ
TA贡献2039条经验 获得超7个赞
简而言之,如果允许的话:
class Slot[+T](var some: T) { def get: T = some } val slot: Slot[Dog] = new Slot[Dog](new Dog) val slot2: Slot[Animal] = slot //because of co-variance slot2.some = new Animal //legal as some is a var slot.get ??
slot.get
然后会在运行时抛出一个错误,因为它没有成功转换Animal
为Dog
(duh!)。
一般来说,变异性与协方差和反方差不相符。这就是为什么所有Java集合都是不变的原因。
添加回答
举报
0/150
提交
取消