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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:37:09