为什么Kotlin内部类无法解析外部类中声明的扩展函数
Kotlin嵌套类无法访问外部类成员扩展函数的原因
核心底层规则
- Kotlin在类内部声明的扩展函数属于成员扩展,天然要求双重接收器才能调用:
- 扩展接收者:即扩展函数的操作对象,本例中为
String类型的实例 - 分发接收者:即声明这个扩展函数的外部类实例,本例中为
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
相关产品推荐
相关产品推荐

