理解协方差示例

时间:2013-12-24 18:36:04

标签: scala covariance

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]AnyAnyRef的父级。

因此,我们可以使用T[Any]创建T[AnyRef],因为AnyRefAny的子类型。

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

这种理解是否正确?

1 个答案:

答案 0 :(得分:1)

你大多是对的。我会这样说:

  • 由于StringAnyRef的子类型,T[String]T[AnyRef]的子类型。
  • 由于IntegerAnyRef的子类型,T[Integer]T[AnyRef]的子类型。

所以我可以说

var s:T[AnyRef] = new T[String]
val i:T[AnyRef] = new T[Integer]
s = i

实际上,不,我不能说第三行。

我不应该被允许这样做,因为这可能意味着T正在做的事情只适用于Integer现在可以对String做的事情。

所以你使用类型边界来解决它。

相关问题