Почему я не могу объявить вложенный класс, который является подклассом запечатанного класса? - PullRequest
0 голосов
/ 02 августа 2020

В Kotlin документации указано:

Запечатанный класс может иметь подклассы, но все они должны быть объявлены в том же файле, что и сам запечатанный класс. (До Kotlin 1.1 правила были еще более строгими: классы должны были быть вложены в объявление запечатанного класса).

По общему признанию, это сформулировано как необходимое, но не достаточное условие, но это означает (из-за отсутствия чего-либо противоположного), что я могу объявить подкласс запечатанного класса в любом месте того же файла.

Учитывая, что следующий код компилируется:

//class Jungle {
    sealed class Animal
    class Tiger : Animal()
//}

почему не компилируется следующее:

class Jungle {
    sealed class Animal
    class Tiger : Animal()
}

Второй фрагмент кода дает следующие ошибки с Intellij Kotlin версия плагина 1.3.72-release-IJ2020.1-5:

Error:(3, 20) Kotlin: Cannot access '<init>': it is private in 'Animal'
Error:(3, 20) Kotlin: This type is sealed, so it can be inherited by only its own nested classes or objects

Фактически, второе сообщение об ошибке здесь кажется, прямо противоречит документации.

1 Ответ

1 голос
/ 02 августа 2020

Существует открытая проблема , которая также отмечает вводящее в заблуждение сообщение c диагностики. Но, похоже, разговор вокруг него утих.

Кроме того, это предложение наследования запечатанного класса с 4 лет go оставляет вопрос о подклассе вложенного запечатанного класса классом на том же уровне, что и открытый вопрос

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