Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 扩展功能是否虚拟到分派接收器?_Kotlin - Fatal编程技术网

Kotlin 扩展功能是否虚拟到分派接收器?

Kotlin 扩展功能是否虚拟到分派接收器?,kotlin,Kotlin,在kotlin中,这意味着什么“就调度接收器类型而言,此类功能的调度是虚拟的,但就扩展接收器类型而言,是静态的。” 这是否意味着“扩展函数不遵循其接收方的类类型。它遵循参数类型(?在此代码调用方法参数中)。” 请给出你热情而慷慨的建议 open class Base { } class Derived : Base() { } open class BaseCaller { open fun Base.printFunctionInfo() { println("Ba

在kotlin中,这意味着什么“就调度接收器类型而言,此类功能的调度是虚拟的,但就扩展接收器类型而言,是静态的。”

这是否意味着“扩展函数不遵循其接收方的类类型。它遵循参数类型(?在此代码调用方法参数中)。”

请给出你热情而慷慨的建议

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”这个词