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