首页 > 解决方案 > 在 Kotlin 中,为什么我不能在内部类的实例上访问外部类?

问题描述

为什么我不能在内部类的实例上访问外部类的属性?

class A(val id: String) {

    inner class B {}
}

fun test() {
    val a = A("test")
    val b = a.B()
    aid(a)
    bid(b)
}

fun aid(a:A): String = a.id
fun bid(b:A.B): String = b.id //Unresolved reference: id

在此示例中,b.id 无法编译。

我收集到我必须在 B 上添加一个返回的吸气剂this@A.id。但为什么?

标签: kotlin

解决方案


内部类仅具有对封闭实例的引用,因此不继承外部类的成员。

由于内部类具有对封闭类的引用,因此只能在类内访问该封闭实例(Java: Outer.this, Kotlin: this@Outer),但是您不能从内部类外部访问封闭实例是正确的。

一个类可以被标记为inner能够访问外部类的成员。
Kotlin 参考/嵌套和内部类

制作自己的 getter 函数来返回封闭的实例是唯一的方法

尽管根据 Jon Skeet生成的对外部实例的引用是包私有的,但 Java 和 Kotlin 都没有任何获取该实例的方法。可以使用反射,但是由于生成的字段名可能不可靠,最好的选择是修改内部类。


推荐阅读