Kotlin:你能解释一下成员扩展功能吗?

我的代码如下:

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()) } 

我的输出如下:

硒与颗粒发生反应

硒与颗粒发生反应

我不明白:为什么第二个输出不应该是“硒与电子反应”?

如果我添加了另一个子类

 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()) } 

输出是:硒与颗粒反应硒与电子反应

为什么第二个输出是“硒与电子反应”?

扩展函数编译为静态函数调用,因此调用的方法是由编译时静态类型而不是对象的运行时类型决定的。

这里没有动态调度,就像调用在子类中重写的方法,而不是基类中的内容。 基本上,没有压倒一切的扩展功能。

具体例子:在编译时,在react(particle: Particle)函数内部,静态类型的Particle在编译时就是Particle ,所以它总是会调用在Particle类中定义的扩展函数。