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

Kotlin中public修饰的匿名对象成员出现未解析引用错误的原因

根本原因

这是Kotlin对匿名对象类型的默认推断规则导致的:

  • 当匿名对象赋值给private修饰的类成员/局部变量时,编译器会保留该匿名对象的独有类型信息,你可以正常访问它自定义的foo、bar等成员
  • 当匿名对象赋值给public/protected/internal修饰的类成员时,编译器会自动将该变量的类型向上擦除为Any类型,而Any类不存在foo、bar成员,因此会报「未解析的引用」错误,和你是否加lateinit没有关系。

适配方案

结合你需要统一管理暴露字符串常量的需求,推荐以下几种实现方式:

方案1:显式定义字符串结构类(最推荐)

提前定义数据类或者接口承载字符串字段,代码示例:

// 定义数据类承载所有字符串字段
data class Strings(
    var foo: String = "",
    var bar: String = ""
)

class Foo {
    public var strings = Strings()

    fun initialize() {
        strings.foo = getFoo()
        strings.bar = getBar()
    }
}

如果所有字符串都是固定常量不需要修改,可以直接用单例对象定义,不需要再封装到Foo类的成员中:

object AppStrings {
    const val FOO = "固定的foo字符串"
    const val BAR = "固定的bar字符串"
}
// 业务代码直接引用即可
AppStrings.FOO

方案2:显式声明匿名对象实现的接口

如果你不想单独定义数据类,可以先声明接口,再显式指定变量类型为该接口:

interface StringsType {
    var foo: String
    var bar: String
}

class Foo {
    // 显式指定变量类型为自定义接口,避免类型被擦除为Any
    public var strings: StringsType = object : StringsType {
        override var foo = ""
        override var bar = ""
    }

    fun initialize() {
        strings.foo = getFoo()
        strings.bar = getBar()
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:45:01