【发布时间】:2013-10-17 13:41:02
【问题描述】:
关于使用下限创建新的不可变类型的方法,我试图了解协方差
class ImmutableArray[+T](item: T, existing: List[T] = Nil) {
private val items = item :: existing
def append[S >: T](value: S) = new ImmutableArray[S](value, items)
}
我知道类型参数 T 不能在 append 方法中使用,因为它违反了规则,但是如果我说 Customer 类和子类 Student 我仍然可以创建类型 U Student.
我可以看到这是可行的,但为什么这不违反规则?我可以理解如果我有一个Students 列表然后添加了一个Customer 我只能返回一个Customers 列表,因为不允许将Customer 分配给Student父类型。但是为什么我可以使用Student?
我错过了什么?
谢谢布莱尔
【问题讨论】:
-
我不明白你的问题。你能举出一个完整的例子来说明什么不是你期望的工作方式吗?
-
您展示了可以工作的代码,但向我们展示不工作的代码会更有用。
-
我想知道为什么我需要 [S >: T]
-
@BlairDavidson 因为函数参数是逆变的并且你的 T 是协变的,这个
[S >: T]tric 提供了将 S 类型的 S 值传递给函数的能力,导致 S 不是协变的 -
“将类型设为 U Student” - 您的意思是在示例类中键入
S吗?
标签: scala generics type-bounds