我正在使用 Kotlin (1.3.20) 中的类扩展,并且在同一属性上扩展父类和子类然后使用这些实例的列表时遇到了问题。
基本上发生的事情是子类的实例返回为父类的属性设置的值,我不明白为什么会这样。我希望下面代码中的第 16 行返回“ext-special-thing”,但它确实返回“ext-thing”,即使 b[1] 中的实例肯定是 ExtSpecialThing 类型。
我怀疑原因是扩展属性/扩展函数在幕后工作的方式(顺便说一句:这个问题也存在于扩展函数中);但我不是这方面的专家。
tl; dr:第 16 行失败……为什么?
import kotlin.test.*
fun main (args : Array<String>) {
assertEquals("ext-special-thing", ExtSpecialThing().prop)
var a = listOf(ImplThing(), ImplSpecialThing())
assertTrue(a[0] is ImplThing)
assertTrue(a[1] is ImplSpecialThing)
assertEquals("impl-thing", a[0].prop)
assertEquals("impl-special-thing", a[1].prop)
var b = listOf(ExtThing(), ExtSpecialThing())
assertTrue(b[0] is ExtThing)
assertTrue(b[1] is ExtSpecialThing)
assertEquals("ext-thing", b[0].prop)
assertEquals("ext-special-thing", b[1].prop) // fails ... why?
}
// ======================================
open class ImplThing () {
open val prop : String = "impl-thing"
}
class ImplSpecialThing : ImplThing() {
override val prop : String = "impl-special-thing"
}
// -------------------------------------
open class ExtThing () {}
class ExtSpecialThing : ExtThing () {}
val ExtThing.prop : String get() = "ext-thing"
val ExtSpecialThing.prop : String get() = "ext-special-thing"