在 Kotlin 中,为什么我不能访问内部类实例上的外部类?

Jon*_*own 4 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
Run Code Online (Sandbox Code Playgroud)

在这个例子中, b.id 编译失败。

我认为我必须在 B 上添加一个返回this@A.id. 但为什么?

Moi*_*ira 9

内部类只引用封闭实例,因此不会继承外部类的成员。

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

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

使您自己的 getter 函数返回封闭实例是执行此操作的唯一方法

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