Scala in Depth以协方差为例介绍了这个例子。
使用共变量参数定义类T
。共变量意味着实例化T[+A]
是合法的,前提是参数是子类型或等于A
的类型。
scala> class T[+A] {}
defined class T
使用T[...]
实例化AnyRef
。
scala> val x = new T[AnyRef]
x: T[AnyRef] = T@11e55d39
然后,将x
分配给T[Any]
。 Any
是AnyRef
的父级。
因此,我们可以使用T[Any]
创建T[AnyRef]
,因为AnyRef
是Any
的子类型。
scala> val y : T[Any] = x
y: T[Any] = T@11e55d39
但是,我们不能对T[String]
执行相同的操作,因为Any
不是字符串的子类型。
scala> val z : T[String] = x
<console>:7: error: type mismatch;
found : T[AnyRef]
required: T[String]
val z : T[String] = x
这种理解是否正确?
答案 0 :(得分:1)
你大多是对的。我会这样说:
String
是AnyRef
的子类型,T[String]
是T[AnyRef]
的子类型。Integer
是AnyRef
的子类型,T[Integer]
是T[AnyRef]
的子类型。所以我可以说
var s:T[AnyRef] = new T[String]
val i:T[AnyRef] = new T[Integer]
s = i
实际上,不,我不能说第三行。
我不应该被允许这样做,因为这可能意味着T
正在做的事情只适用于Integer
现在可以对String
做的事情。
所以你使用类型边界来解决它。