Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 在科特林,为什么可以';我不能在内部类的实例上访问外部类吗?_Kotlin - Fatal编程技术网

Kotlin 在科特林,为什么可以';我不能在内部类的实例上访问外部类吗?

Kotlin 在科特林,为什么可以';我不能在内部类的实例上访问外部类吗?,kotlin,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无法编

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

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上添加一个getter,返回
this@A.id
。但是为什么呢?

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

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

类可以标记为
内部
,以便能够访问外部类的成员。
/

让您自己的getter函数返回封闭实例就是这样做的

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