簡體   English   中英

Scala 中上界優於子類型的優勢

[英]Advantage of Upper Bound over Subtyping in Scala

我知道這個問題在這里之前已經被問過。 但是那里的答案並不能滿足我的疑問。
有人告訴我,它們可以防止混淆 class 類型,下面的代碼表明它們根本沒有混淆。
所以,應該沒關系吧?

課程:

package Practice

abstract class Animal {
  def name: String
}

abstract class Pet extends Animal {}

class Cat extends Pet {
  override def name: String = "Cat"
}

class Dog extends Pet {
  override def name: String = "Dog"
}

這是真正的困惑:

//Class with Upper Bound
class PetContainer[P <: Pet](p: P) {
  def pet: P = p
}

//Class with Subtyping(Or Upcasting, I think they're the same)
class SimplePetContainer(p: Pet){
  def pet: Pet = p
}

驅動程序代碼:

val CatContainer: PetContainer[Cat] = new PetContainer[Cat](new Cat)
val DogContainer: SimplePetContainer = new SimplePetContainer(new Dog
println(CatContainer.pet.getClass)
println(DogContainer.pet.getClass)

Output:

class Practice.Cat
class Practice.Dog
//Practice was the package

就像我之前提到的,這些類被保留了。
所以我的問題是,Upper Bound 對 Subtyping 有什么優勢?

通過您的CatContainer ,您知道CatContainer.pet在編譯時是Cat 這意味着編譯器也知道這一點。 所以你可以說

 CatContainer.pet.meow()

對於SimplePetContainer ,您不再有關於里面pet的 static 類型信息。

就像我之前提到的,這些類被保留了。

在運行時, pet當然仍然知道它的類型(嗯,幾乎,它知道它的 class,在你的情況下就足夠了,任何額外的類型信息,例如 class 的泛型類型都已被刪除)。 但是變量DogContainer.pet缺少關於它包含什么樣的Pet的信息。

有人告訴我,它們可以防止混淆 class 類型

編譯器不會阻止你寫作

val DogContainer = new SimplePetContainer(new Cat())

但它會拒絕這個

val DogContainer = new PetContainer[Dog](new Cat())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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