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

为什么Kotlin内部类无法解析外部类中声明的扩展函数

Kotlin嵌套类无法访问外部类成员扩展函数的原因

核心底层规则

  • Kotlin在类内部声明的扩展函数属于成员扩展,天然要求双重接收器才能调用:
    1. 扩展接收者:即扩展函数的操作对象,本例中为String类型的实例
    2. 分发接收者:即声明这个扩展函数的外部类实例,本例中为A类的实例
      只有同时存在两个接收器的上下文,才能正常解析调用该成员扩展函数。
  • 你代码中的class B没有加inner关键字,属于嵌套类(对应Java的静态内部类),默认不会持有外部类A的实例引用,本身连A的普通成员变量、普通成员方法都无法直接访问,自然也拿不到foo()需要的A类型分发接收器,所以LINE2会报错。

代码场景说明

  • LINE1处于A类的实例初始化上下文,天然持有当前A实例作为分发接收器,满足双重接收器要求,所以可以正常调用foo()。
  • 如果将class B改为inner class B,让它变成非静态内部类,持有外部类A的实例引用,此时LINE2的foo()就能正常解析调用。

可选兼容方案

如果不想给B加inner关键字,也可以手动传入A的实例,手动带入分发接收器上下文来调用扩展:

class A{
    val a = "as".foo()
    class B(val aInstance: A){
        val b = aInstance.run { "as".foo() } // 手动带入A的实例上下文即可正常调用
    }

    fun String.foo(){}
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:48:02