Kotlin中移除方法private修饰符后为何无法访问匿名对象成员?
问题原因解析
这是Kotlin编译器针对私有函数和非私有函数的返回类型推断规则差异导致的:
- 当
getObject是private修饰时,编译器明确这个函数只能在类C内部被调用,因此会把返回值的类型推断为匿名对象的实际类型(包含x属性的具体匿名类型)。所以在printX里调用getObject().x时,编译器能识别到x属性,不会报错。 - 当移除
private修饰符后,getObject变成公开函数,此时编译器会把返回类型推断为Any(Kotlin所有类型的根类)。而Any类中并没有定义x属性,代码自然就抛出Unresolved reference: x的错误。
简单来说,Kotlin对私有函数的返回类型推断会保留匿名对象的具体信息,而公开函数的匿名对象返回类型会被“抹平”成最顶层的Any,自然就找不到x了。
如果想让公开版本的getObject也能正常访问x,你需要定义一个明确的接口或类来承载x属性,示例如下:
interface HasX { val x: String } class C { fun getObject(): HasX = object : HasX { override val x: String = "x" } fun printX() { println(getObject().x) } }
这样编译器就能识别到返回类型是HasX,里面包含x属性,调用就不会出错了。
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

