簡體   English   中英

下界 Scala

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM