进入数据结构的子类型对象是否成为该数据结构的声明类型?例如,如果我将狗的对象放入哺乳动物列表中,对象的类型会改变吗?
open class Mammal(str: String)
class Dog : Mammal("")
val d : Dog = Dog()
var listOfMammal: MutableList<Mammal> = mutableListOf()
listOfMammal.add(d)
答案 0 :(得分:2)
您需要了解静态类型和运行时类型之间的区别。两者的答案都是“否”,但是出于不同的原因。
静态类型是编译器看到的类型。这里: Dog
和: MutableList<Mammal>
指定静态类型(但Dog()
未指定)。具有静态类型的不是对象,而是表达式。 d
的类型当然不会因调用listOfMammal.add(d)
而改变,您仍然可以在下面使用它,并且仍然是Dog
。
即使您知道val e = listOfMammals[0]
和d
都可以,但是如果您得到的值d
的类型不同,但这并不会改变e
的类型。指向同一对象。
运行时类型是对象在运行时具有的类。在JVM上不能更改;创建新对象时,其类是固定的。
每个静态类型都可以擦除为运行时类型(例如MutableList<Mammal>
擦除为java.util.List
);对于任何表达式,如果它求值为某个值(对象或基元),则该值的运行时类型将是删除表达式的静态类型的子类型。