私はこのscalaコードを持っています:
class Creature {
override def toString = "I exist"
}
class Person(val name: String) extends Creature {
override def toString = name
}
class Employee(override val name: String) extends Person(name) {
override def toString = name
}
class Test[T](val x: T = null) {
def upperBound[U <: T](v: U): Test[U] = {
new Test[U](v)
}
def lowerBound[U >: T](v: U): Test[U] = {
new Test[U](v)
}
}
Creature、Person、および Employee の間の階層関係を確認できます。
Creature <- Person <- Employee
デフメインで:
val test = new Test[Person]()
val ub = test.upperBound(new Employee("John Derp")) //#1 ok because Employee is subtype of Person
val lb = test.lowerBound(new Creature()) //#2 ok because Creature is supertype of Person
val ub2 = test.upperBound(new Creature()) //#3 error because Creature is not subtype of Person
val lb2 = test.lowerBound(new Employee("Scala Jo")) //#4 ok? how could? as Employee is not supertype of Person
私が理解できることは次のとおりです。
A <: B
define A はサブタイプであるか、B と等しい必要があります (上限)A >: B
define A はスーパータイプであるか、B と等しい必要があります (下限)
しかし、#4はどうなりましたか?なぜエラーが出ないのですか?Employee は Person のスーパータイプではないため、バインドされた type parameter に準拠するべきではないと思います[U >: T]
。
誰でも説明できますか?