scala - Scala中上界优于子类型的优势
问题描述
我知道这个问题在这里之前已经被问过。但是那里的答案并不能满足我的怀疑。
有人告诉我它们可以防止混淆类类型,下面的代码表明它们根本没有混淆。
所以,应该没关系吧?
课程:
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)
输出:
class Practice.Cat
class Practice.Dog
//Practice was the package
就像我之前提到的,这些类被保留了。
所以我的问题是,Upper Bound 对 Subtyping 有什么优势?
解决方案
使用您的CatContainer
,您知道这CatContainer.pet
是Cat
在编译时。这意味着编译器也知道这一点。所以你可以说
CatContainer.pet.meow()
因为SimplePetContainer
你不再有关于pet
内部的静态类型信息。
就像我之前提到的,这些类被保留了。
在运行时,pet
当然仍然知道它的类型(嗯,几乎,它知道它的类,在你的情况下就足够了,任何额外的类型信息,例如该类的泛型类型都已被删除)。但是该变量DogContainer.pet
缺少关于Pet
它包含何种类型的信息。
有人告诉我,它们可以防止混淆班级类型
编译器不会阻止你写作
val DogContainer = new SimplePetContainer(new Cat())
但它会拒绝这个
val DogContainer = new PetContainer[Dog](new Cat())
推荐阅读
- odoo-11 - 在草稿发票上显示编号
- javascript - 如何重新调用 HUB 中的方法?asp网络核心信号器
- python - 如何在 Dataframe 的 192 列(每列 80000 个值)中查找 NaT 和 NaN 首次出现的位置
- integration-testing - 如何在集成测试中模拟 LocalDateTime.now()。我正在使用 Spring Runner 而不是 PowerMock
- css - 导入所有包含 SASS 文件的文件夹
- amazon-web-services - AWS EC2 ssh 无法正常工作
- eclipse-plugin - SWT-如何将数据从一个页面传输到另一个页面
- c# - C# 简单控制台应用程序显示/逻辑问题
- python - 如何通过重新启动应用程序克服 ModbusTcpServer 中的“地址已在使用中”?
- javascript - 我如何获得其他应用程序的通知计数?