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

Я не понимаю, почему компилятор предлагает мне преобразовать запечатанный класс с подклассами в объекты, давайте рассмотрим пример:

sealed class CallState
class SendReceive : CallState()
class SendOnly:CallState()

в этот

sealed class CallState
object SendReceive : CallState()
object SendOnly:CallState()

Похоже, это мешает мне создать объект без состояния, но я не знаю, что означает компилятор.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Компилятор говорит:

Запечатанный подкласс не имеет состояния и не имеет переопределенных равных, преобразовывает запечатанный подкласс в объект

Из этого вы можете сделать вывод, что если Например, SendReceive имеет состояние , предупреждение будет go прочь. И действительно, если вы измените объявление на

class SendReceive(val i: Int) : CallState()

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

Объяснение простое. Если между разными экземплярами SendReceive нет разницы, зачем разрешать разные экземпляры? Если сделать его object, он станет единичным, что имеет смысл делать, когда разные экземпляры ничем не отличаются.

0 голосов
/ 26 марта 2020

закрытые классы похожи на enum в java, но это позволяет сохранять состояние. если подкласс не сохраняет состояние, он может быть просто объектом.

SendReceive - это объект, но SenOnly будет классом.

sealed class CallState {
    object SendReceive : CallState()
    class SendOnly(var totalReceiver:Int) : CallState()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...