我的代码如下:
open class Particle
class Electron : Particle()
open class Element(val name: String) {
open fun Particle.react(name: String): Unit {
println("$name is reacting with a particle")
}
open fun Electron.react(name: String): Unit {
println("$name is reacting with an electron")
}
fun react(particle: Particle): Unit {
particle.react(name)
}
}
fun main(args: Array<String>) {
val selenium = Element("Selenium")
selenium.react(Particle())
selenium.react(Electron())
}
我的输出如下:
硒与粒子反应
硒与粒子反应
我不明白:为什么第二个输出不应该是#34; Selenium正在与电子反应&#34;?
如果我添加了另一个子类
class NobleGas(name: String) : Element(name) {
fun react(particle: Electron): Unit {
particle.react(name)
}
}
fun main(args: Array<String>) {
val neon = NobleGas("Selenium")
neon.react(Particle())
neon.react(Electron())
}
输出是: 硒与颗粒反应 硒与电子反应
为什么第二个输出是&#34; Selenium正在与电子反应&#34;?
答案 0 :(得分:2)
扩展函数编译为静态函数调用,因此调用哪个方法由编译时静态类型而不是对象的运行时类型确定。
这里没有动态调度,就像你调用一个在子类中重写的方法而得到的那样,你得到的是实现,而不是基类中的实现。基本上,没有重要的扩展功能。
具体示例:在编译时,在react(particle: Particle)
函数内,particle
的静态类型在编译时只是Particle
,所以它总是调用扩展函数& #39;在Particle
类上定义。