遇到 Constructor of inner class … can be called only with receiver of containing class 错误,通常是因为你在尝试实例化一个 inner class 时,没有正确地提供外部类的实例。
在 Kotlin 中,inner class 会持有外部类的引用,因此要实例化 inner class,你需要先实例化外部类,再通过外部类的实例来创建内部类的实例。
错误解析
当你遇到错误信息 Constructor of inner class … can be called only with receiver of containing class,这意味着你尝试直接实例化 inner class,但是没有提供外部类的实例。Kotlin 要求你通过外部类的实例来访问 inner class 的构造函数。
解决方法
确保你通过外部类的实例来创建内部类的实例。举个例子:
class OuterClass {
val someProperty = "Hello from outer class"
inner class InClass {
fun printInfo() {
println(someProperty)
}
}
}
你不能直接通过 OuterClass.InClass() 来实例化内部类 InClass,因为它是 inner class,它需要一个外部类的实例。
正确的方式:
fun main() {
// 创建外部类的实例
val outerInstance = OuterClass()
// 通过外部类的实例来创建内部类的实例
val innerInstance = outerInstance.InClass()
// 调用内部类的方法
innerInstance.printInfo() // 输出: Hello from outer class
}
解释
- InClass是 OuterClass 的内部类,内部类持有外部类的引用,因此必须通过外部类的实例来创建它的对象。
- 使用 outerInstance.InClass() 来正确地实例化内部类。
如果你直接尝试:
val innerInstance = OuterClass.InClass() // 错误
你会遇到 Constructor of inner class InClass can be called only with receiver of containing class 错误。因为 InClass是 inner class,你必须先创建 OuterClass 的实例才能创建 InClass的实例。
总结
- 内类 (inner class) 必须通过外部类的实例来创建,因为它持有外部类的引用。
- 确保你先实例化外部类,再通过外部类的实例来实例化内部类。