进入数据结构的子类型对象是否成为该数据结构的声明类型?

时间:2019-07-25 02:32:58

标签: generics kotlin data-structures

进入数据结构的子类型对象是否成为该数据结构的声明类型?例如,如果我将狗的对象放入哺乳动物列表中,对象的类型会改变吗?

open class Mammal(str: String)

class Dog : Mammal("")

val d : Dog = Dog()

var listOfMammal: MutableList<Mammal> = mutableListOf()
listOfMammal.add(d)

1 个答案:

答案 0 :(得分:2)

您需要了解静态类型和运行时类型之间的区别。两者的答案都是“否”,但是出于不同的原因。

  1. 静态类型是编译器看到的类型。这里: Dog: MutableList<Mammal>指定静态类型(但Dog()未指定)。具有静态类型的不是对象,而是表达式。 d的类型当然不会因调用listOfMammal.add(d)而改变,您仍然可以在下面使用它,并且仍然是Dog

    即使您知道val e = listOfMammals[0]d都可以,但是如果您得到的值d的类型不同,但这并不会改变e的类型。指向同一对象。

  2. 运行时类型是对象在运行时具有的类。在JVM上不能更改;创建新对象时,其类是固定的。

每个静态类型都可以擦除为运行时类型(例如MutableList<Mammal>擦除为java.util.List);对于任何表达式,如果它求值为某个值(对象或基元),则该值的运行时类型将是删除表达式的静态类型的子类型。