Kotlin内部类构造调用报错:需包含类接收者,如何解决?
问题解决:内部类构造报错的处理方案
你遇到的报错是因为Kotlin中inner类持有外部类的引用,必须依赖外部类的实例才能创建。直接在外部类的属性初始化代码里调用InnerClass()时,外部类还没完成初始化,没有可用的实例作为内部类的接收者,所以报错。
下面是几种可行的解决方法:
方法1:将内部类改为嵌套类(去掉inner关键字)
如果内部类不需要访问外部类的成员,直接去掉inner即可;如果需要访问str,可以把外部类成员作为参数传入内部类:
data class Outer( val str: String = "fOo" // ...其他属性 ) { class InnerClass(private val outerStr: String) { fun foo(): String { return outerStr.toLowerCase() } } } // 使用示例: val outer = Outer() val inner = Outer.InnerClass(outer.str)
方法2:延迟初始化内部类实例
用lateinit或by lazy延迟初始化innerClassInstance,等外部类实例创建完成后再初始化内部类:
方式A:lateinit
data class Outer( val str: String = "fOo" // ...其他属性 ) { lateinit var innerClassInstance: InnerClass init { innerClassInstance = InnerClass() } inner class InnerClass { fun foo(): String { return str.toLowerCase() } } }
方式B:by lazy
data class Outer( val str: String = "fOo" // ...其他属性 ) { val innerClassInstance: InnerClass by lazy { InnerClass() } inner class InnerClass { fun foo(): String { return str.toLowerCase() } } }
方法3:在构造函数的init块中初始化
把内部类实例的初始化放到init块里,此时外部类实例已经存在,可正常创建内部类:
data class Outer( val str: String = "fOo" // ...其他属性 ) { val innerClassInstance: InnerClass init { innerClassInstance = InnerClass() } inner class InnerClass { fun foo(): String { return str.toLowerCase() } } }
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

