Kotlin 扩展功能是否虚拟到分派接收器?
在kotlin中,这意味着什么“就调度接收器类型而言,此类功能的调度是虚拟的,但就扩展接收器类型而言,是静态的。” 这是否意味着“扩展函数不遵循其接收方的类类型。它遵循参数类型(?在此代码调用方法参数中)。” 请给出你热情而慷慨的建议Kotlin 扩展功能是否虚拟到分派接收器?,kotlin,Kotlin,在kotlin中,这意味着什么“就调度接收器类型而言,此类功能的调度是虚拟的,但就扩展接收器类型而言,是静态的。” 这是否意味着“扩展函数不遵循其接收方的类类型。它遵循参数类型(?在此代码调用方法参数中)。” 请给出你热情而慷慨的建议 open class Base { } class Derived : Base() { } open class BaseCaller { open fun Base.printFunctionInfo() { println("Ba
open class Base { }
class Derived : Base() { }
open class BaseCaller {
open fun Base.printFunctionInfo() {
println("Base extension function in BaseCaller")
}
open fun Derived.printFunctionInfo() {
println("Derived extension function in BaseCaller")
}
fun call(b: Base) {
b.printFunctionInfo() // call the extension function
}
}
class DerivedCaller: BaseCaller() {
override fun Base.printFunctionInfo() {
println("Base extension function in DerivedCaller")
}
override fun Derived.printFunctionInfo() {
println("Derived extension function in DerivedCaller")
}
}
fun main() {
BaseCaller().call(Base()) // "Base extension function in BaseCaller"
DerivedCaller().call(Base()) // "Base extension function in DerivedCaller" - dispatch receiver is resolved virtually
DerivedCaller().call(Derived()) // "Base extension function in DerivedCaller" - extension receiver is resolved statically
}
既然您已经链接了文档,我认为您已经阅读了以下部分 在其中声明扩展的类的实例被调用 调度接收方,扩展方法的接收方类型实例称为扩展接收方 理解上述术语后,您需要理解以下几点
- 如果您不了解虚拟方法,请阅读
- 。考虑下面的代码块
fun call(b: Base) { // This will always call extension function defined on the Base class // even if you pass an object of Derived class b.printFunctionInfo() // call the extension function } // This calls the printFunctionInfo defined on the Base, even though we pass Derived DerivedCaller().call(Derived())
调用
函数将始终调用基类型上定义的扩展函数。
但是将调用哪个扩展函数?基类中的一个还是派生类中的一个
这取决于调用
call
函数的对象的类型,如果您使用Base对象调用调用,则将调用基类中的扩展;如果您使用派生对象,则将调用派生类中的扩展。谢谢,我想我非常关注“virtual”这个词