对于 Scala 大师来说,这可能是一件容易的事。我正在阅读类型绑定约束并想知道我是否遗漏了一些东西,因为我看到了一个稍微出乎意料的行为。假设我们在这样的层次结构中有三种类型 A、B、C,我们正在尝试使用类型边界:
class A {
}
class B extends A {
}
class C extends B {
}
class MyList1 { // T super B
def add[T >: B](a: T): Unit = {}
}
class MyList2 { // T extends B
def add[T <: B](a: T): Unit = {}
}
class MyList3[T >: B] { // T super B
def add(a: T): Unit = {}
}
class MyList4[T <: B] { // T extends B
def add(a: T): Unit = {}
}
object BoundsClass {
def main(args: Array[String]) {
val l1 = new MyList1
l1.add(new A)
l1.add(new B)
l1.add(new C) // why is this allowed??
val l2 = new MyList2
// l2.add(new A) // not allowed (OK)
l2.add(new B)
l2.add(new C)
val l3a = new MyList3[A]
val l3b = new MyList3[B]
// val l3c = new MyList3[C] // not allowed (OK)
// val l4a = new MyList4[A] // not allowed (OK)
val l4b = new MyList4[B]
val l4c = new MyList4[C]
}
}
除一种情况外,所有集合的行为均符合预期,请参见 l1.add(new C); 不会导致编译错误。为什么允许这样做?
谢谢!