Вложенный класс во внутренний класс

Есть ли способ определить вложенный класс во внутреннем классе? Я думал, что вложенные классы - это просто пространство имен без последствий во время выполнения, поэтому я не понимаю, почему ниже не следует проверять тип:

class Outer {
    inner class Inner {
        class Nested {
    }
}

Это дает мне ошибку «Класс здесь не разрешен» в строке class Nested.

Конечно, я мог бы просто переместить определение Nested рядом с Inner, и все заработало бы; но в моем реальном случае использования Nested имеет отношение только к реализации Inner, поэтому я хотел бы сохранить его внутри.


person Cactus    schedule 09.08.2018    source источник
comment
В Java внутреннему классу не разрешается объявлять статические члены. Kotlin использует тот же принцип. Если бы это было не так, совместимость с Java была бы гораздо более запутанной, только чтобы принести пользу второстепенной проблеме.   -  person Marko Topolnik    schedule 09.08.2018


Ответы (1)


Так будет ли это работать? Теперь Nested может получить доступ к Inner и Outer. Исключение вложенной внутренней части не допускается для различных проблем, связанных с закрытием.

class Outer {
    inner class Inner {
        inner class Nested {
    }
}

Классы данных

data class Outer2(var foo: Int) {
    data class Inner(var foo: Int) {
        data class Nested(var foo: Int) {

        }
    }
}
person Steven Spungin    schedule 09.08.2018
comment
Что, если я хочу, чтобы Nested был классом данных? - person Cactus; 09.08.2018
comment
вы не можете использовать внутреннее и данные вместе. - person Steven Spungin; 09.08.2018
comment
Извините, я имел в виду, что если только Nested должен быть классом данных? В этом случае его нельзя превратить во внутренний класс Inner, поскольку классы данных не могут быть внутренними классами. - person Cactus; 09.08.2018
comment
К сожалению, классы данных являются особыми и не могут содержать ссылки на родителя. - person Steven Spungin; 09.08.2018
comment
Да, это не было бы проблемой, если бы оно было вложенным, а не внутренним. Отсюда мой первоначальный вопрос. - person Cactus; 09.08.2018