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
相关产品推荐
相关产品推荐

