Почему классы данных в Kotlin нельзя пометить внутренним модификатором? - PullRequest
2 голосов
/ 02 марта 2020

У меня есть простой класс, скажем, User. Теперь я хочу создать inner data class, скажем, UserProperty внутри User класса, но как только я добавлю inner модификатор к data class UserProperty, среда IDE пожалуется на Modifier inner несовместимо с данными . Чего мне не хватает?

Ответы [ 2 ]

4 голосов
/ 02 марта 2020

С одной стороны, внутренние классы используют внешний экземпляр в качестве скрытого первого параметра конструктора (который фактически равен private val). С другой стороны, поведение класса данных предоставляет все параметры конструктора, включая их имена (в toString()), поэтому они «должны быть» видимыми. Кроме того, в этом случае

Если у супертипа есть функции componentN (), которые открыты и возвращают совместимые типы, соответствующие функции генерируются для класса данных и переопределяют функции супертипа. Если функции супертипа не могут быть переопределены из-за несовместимых сигнатур или являются окончательными, сообщается об ошибке:

должен component1() быть внешним экземпляром или первым параметром, который вы фактически написали?

Дизайнеры, вероятно, решили, что любое поведение будет удивлять достаточное количество пользователей, поэтому лучше вообще это не разрешать. И если вы хотите, чтобы ваш UserProperty был подобен внутреннему классу, просто добавьте параметр конструктора User самостоятельно.

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

Экземпляр внутреннего класса зависит от существования экземпляра внешнего класса, т. Е. Вы не можете иметь экземпляр внутреннего класса без внешнего. Теперь, если вы попытаетесь сохранить этот объект в БД модификатор «data» объявляет внутренний объект как собственный экземпляр, который будет сохранен, с нарушением ограничений внутреннего класса.

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

Следовательно, вы можете применять модификатор 'data' только к внешнему классу ... он также должен хранить внутренний класс (нужно проверить это) , если вам нужен внутренний класс, независимый в вашей БД, то это должен быть собственный класс.

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