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

访问类中匿名类成员时出现Unresolved reference错误的原因

问题原因

你这段代码报错的核心原因是Kotlin对匿名对象的类型推断规则:
当你在类A中声明val b = object{ val x = 1 }时,这个匿名对象的类型会被编译器推断为Any(因为没有指定显式的父类型)。而Any类并没有x属性,所以在main函数中尝试访问y.b.x时,编译器找不到对应的属性,就会抛出Unresolved reference: x错误。

注意:匿名对象只有在局部作用域(比如函数内部)或者private成员中,编译器才会保留它的实际类型。但你的b是类A的public成员,所以会被向上转型为Any。

解决方法

有两种简单可行的修复方式:

  1. 显式指定匿名对象的父类型
    定义一个包含x属性的接口或抽象类,让匿名对象实现该类型,这样b的类型就会被推断为这个接口/抽象类,外部就能访问x了:
interface XHolder {
    val x: Int
}

class A{
    val b: XHolder = object : XHolder {
        override val x = 1
    }
}

fun main() {
    val y = A()
    println(y.b.x) // 正常输出1
}
  1. 将b声明为private成员(仅适用于类内部访问)
    如果只需要在类A内部访问b.x,可以把b标记为private,此时编译器会保留匿名对象的实际类型:
class A{
    private val b = object{
        val x = 1
    }

    fun printX() {
        println(b.x) // 类内部可以正常访问
    }
}

fun main() {
    val y = A()
    y.printX() // 输出1
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:24:52