В Kotlin, почему я не могу получить доступ к внешнему классу на экземпляре внутреннего класса? - PullRequest
0 голосов
/ 30 августа 2018

Почему я не могу получить доступ к свойствам внешнего класса в экземпляре внутреннего класса?

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 голосов
/ 30 августа 2018

Внутренний класс просто имеет ссылку на включающий экземпляр и поэтому не наследует членов внешнего класса.

Поскольку внутренние классы имеют ссылку на включающий класс, к этому включающему экземпляру можно получить доступ только внутри класса (Java: Outer.this, Kotlin: this@Outer), но вы правы в том, что вы не может получить доступ к включающему экземпляру извне внутреннего класса.

Класс может быть помечен как inner, чтобы иметь доступ к членам внешнего класса.
Kotlin Reference / Вложенные и внутренние классы

Создание собственной функции получения для возврата включающего экземпляра - единственный способ сделать это.

Хотя сгенерированная ссылка на внешний экземпляр является пакетной , согласно Джону Скиту , ни у Java, ни у Kotlin нет никакого способа получить этот экземпляр. Вы можете использовать отражение, но, поскольку имя сгенерированного поля, возможно, ненадежно, ваш лучший выбор - изменить внутренний класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...