You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何调用被重写的扩展方法的父类实现?

结论

Kotlin支持调用父类中定义的成员扩展函数的super实现,你遇到的编译错误是因为语法使用不正确,该类扩展函数同时存在分发接收者(定义扩展的A/C类实例)和扩展接收者(被扩展的B类实例),需要用特殊语法指定两个接收者的对应关系。

正确实现代码

把C类中重写的扩展方法修改为以下写法即可正常编译运行:

class C : A() {
    override fun B.doSomething() {
        print("first, do some C-specific logic")
        print("now try to call super implementation. How?")
        // 正确调用父类实现的写法
        super<A>.run { doSomething() }
    }
}

原错误写法说明

  • super.doSomething():未指定super对应的接收者类型,编译器无法区分是分发接收者的父类还是扩展接收者的父类,编译失败
  • super<A>.doSomething():doSomething是B的扩展方法,调用时必须传入B类的扩展接收者,该写法缺少扩展接收者参数,编译失败
  • super<B>.doSomething():B类本身没有定义doSomething成员方法,该方法是A类中定义的扩展,匹配不到对应实现,编译失败

原理说明

类内部定义的成员扩展函数本质是包含两个隐含参数的类成员:第一个参数是扩展所属类的实例(分发接收者),第二个参数是被扩展类的实例(扩展接收者)。上面的正确写法通过super<A>.run切换分发接收者的作用域到父类A的super实例,当前重写方法内的B实例会自动作为扩展接收者传入,就能正常调用到父类的实现。

内容的提问来源于stack exchange,提问作者user16038501

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:45:06