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

时间:2018-08-30 02:56:27

标签: 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的吸气剂。但是为什么呢?

1 个答案:

答案 0 :(得分:2)

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

由于内部类对封装类有引用,因此只能在该类内(Java:ajax-pagination,Kotlin:Outer.this访问此封装实例。您是正确的,您无法从内部类外部访问封闭的实例。

  

一个类可能被标记为this@Outer,以便能够访问外部类的成员。
   Kotlin Reference / Nested and Inner Classes

让自己的getter函数返回封闭的实例是the only way

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