[英]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.