Kotlin:你能解释一下成员扩展函数吗?
Kotlin : can you explain member extension functions?
我的代码如下:
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())
}
我的输出如下:
硒正在与粒子发生反应
硒正在与粒子发生反应
我不明白:为什么第二个输出不应该是 "Selenium is reacting with an 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())
}
输出是:
硒与粒子发生反应
硒与电子反应
为什么第二个输出是"Selenium is reacting with an electron"?
扩展函数编译为静态函数调用,因此调用哪个方法是由编译时静态类型而不是对象的运行时类型决定的。
这里没有动态调度,就像您调用在子class 中重写的方法时得到的那样,您得到的是该实现而不是基础 class 中的实现。基本上,没有覆盖扩展功能。
具体的例子:在编译时,在react(particle: Particle)
函数内部,particle
的静态类型在编译时只是Particle
,所以它总是会调用扩展在 Particle
class.
上定义的函数
我的代码如下:
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())
}
我的输出如下:
硒正在与粒子发生反应
硒正在与粒子发生反应
我不明白:为什么第二个输出不应该是 "Selenium is reacting with an 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())
}
输出是: 硒与粒子发生反应 硒与电子反应
为什么第二个输出是"Selenium is reacting with an electron"?
扩展函数编译为静态函数调用,因此调用哪个方法是由编译时静态类型而不是对象的运行时类型决定的。
这里没有动态调度,就像您调用在子class 中重写的方法时得到的那样,您得到的是该实现而不是基础 class 中的实现。基本上,没有覆盖扩展功能。
具体的例子:在编译时,在react(particle: Particle)
函数内部,particle
的静态类型在编译时只是Particle
,所以它总是会调用扩展在 Particle
class.