[英]Lower Bound Scala
class Animal
class Cat extends Animal
class Dog extends Animal
上限
class CageUP[A <: Animal](animal: A)
下限
class CageLB[A >: Animal](animal: A)
根据上限定义,它可以接受 A 必须与 Animal 或 Sub-Type of Animal 相同。
val cageup = new CageUP(new Dog)
根据下限定义,它可以接受 A 必须与 Animal 或 Super-Type of Animal 相同。
val cagelb = new CageLB(new Dog)
为什么下界是接受和编译甚至传递了狗实例,这不是Animal的超类型。
类型边界在调用站点和定义站点都影响方法,有时以令人惊讶的方式。
让我们建立一个类型层次结构。
class Base {val base = 'B'}
class Mid extends Base {val mid = 'M'}
class End extends Mid {val end = 'E'}
现在让我们从更常见的上限开始。
def f[T <: Mid](t:T):Int = {
val x = t.base
val y = t.mid
//val z = t.end <--won't compile
42
}
//f(new Base) <--doesn't conform to bounds
f(new Mid) //OK
f(new End) //OK, promoted to Mid in the f() code
正如预期的那样,没有t.end
因为它不是Mid
类型的一部分,并且您不能使用Base
类型调用它,因为这不会在每个Mid
类型Mid
都期望mid
成员。
现在让我们将其翻转到下边界。
def f[T >: Mid](t:T):Int = {
//val x = t.base <--won't compile
//val y = t.mid <--won't compile
//val z = t.end <--won't compile
42
}
f(new Base) //OK
f(new Mid) //OK
f(new End) //OK
f(List(9)) //OK!!
如您所见,没有上限的接收参数并不是非常有用,因为编译器认为它可能是Mid
类型,但它可能是Any
类型,并且因为任何东西都可以提升为Any
类型,所以Any
东西都是允许的在调用站点,但在方法定义站点几乎一无所知。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.