おそらく Scala の達人にとっては簡単なことでしょう。少し予期しない動作が見られるため、型のバインドされた制約について調べて、何かが足りないのではないかと考えています。このような階層に 3 つの型 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]
}
}
コレクションは、1 つのケースを除いてすべて期待どおりに動作しています。l1.add(new C); を参照してください。コンパイルエラーを引き起こしません。なぜこれが許可されているのですか?
ありがとう!