Kotlin不同访问修饰符下匿名对象的实现差异原因探究
Kotlin 不同访问修饰符下匿名对象返回类型差异原因
这个差异是Kotlin编译器为了兼顾代码灵活性和公开API稳定性做的刻意设计,核心逻辑如下:
- 匿名对象本身没有公开、固定的类型名,它的实际类型是编译器在编译阶段临时生成的内部类型,不会被声明到模块的公开API中。
- 如果允许
public修饰的函数返回匿名对象的具体生成类型,相当于把一个随时可能随内部代码调整而变化的不稳定类型暴露给模块外部。外部调用方如果依赖这个类型的属性/方法,只要模块内部修改了匿名对象的结构,所有依赖它的外部代码都会直接报错,严重破坏公开API的向前兼容性。 - 而用
private修饰的函数可见范围仅局限于当前类/当前文件,不会暴露给模块外部,编译器可以完全掌握这个匿名对象的所有使用场景,所以不需要做类型擦除,会直接返回它的实际类型,允许直接访问内部定义的x属性。
如果需要public函数返回的匿名对象可以访问内部属性,只需要让匿名对象显式实现一个公开的接口即可,比如:
// 先定义公开接口 interface XHolder { val x: String } // 匿名对象实现该接口 fun bar() = object : XHolder { override val x: String = "x" }
这种情况下bar的返回类型会被编译器推断为公开接口XHolder,属于稳定的公开API类型,外部调用方就可以正常访问x属性,也不会影响API兼容性。
内容的提问来源于stack exchange,提问作者Ji Sungbin
相关产品推荐
相关产品推荐

