Parcelize жалуется "Parcelable должен быть классом" на объекты и перечисления
Когда я пытаюсь комментировать enum class
или же object
с @Parcelize
, это приводит к ошибке 'Parcelable' should be a class
, как подсказка редактора и как ошибка компиляции. Я могу @Parcelize
классы просто отлично, но я не могу делать такие вещи, как
@Parcelize object MySingletion : Parcelable
@Parcelize enum class Direction : Parcelable { N, E, W, S }
Это происходит, даже несмотря на то, что на веб-сайте Kotlin явно указываются объекты и перечисления. Есть ли способ исправить это, чтобы я мог @Parcelize
эти типы классов? И в идеале, есть ли решение, которое не предполагает ручного кодирования логики парсера?
2 ответа
Документированная поддержка означает, что объекты и перечисления должным образом обрабатываются при использовании в качестве свойств для класса, подлежащего сортировке. Что более важно, оба типа неявно исключаются из использования, так как поля должны быть свойствами, определенными в основном конструкторе:
@Parcelize
требует, чтобы все сериализованные свойства были объявлены в основном конструкторе. Расширения Android будут выдавать предупреждение о каждом свойстве с полем поддержки, объявленным в теле класса. Также,@Parcelize
не может быть применено, если некоторые из параметров основного конструктора не являются свойствами.
Если вам нужно использовать ваши объекты или перечисления только как свойство, с этим проблем нет. Если вы хотите использовать его как Parcelable
вы не можете обойтись без реализации интерфейса самостоятельно, так как оба типа являются своего рода одноэлементной реализацией и @Parcelize
поддерживает только типы с доступными конструкторами со свойствами.
Начиная с Kotlin 1.2.60, CHANGELOG утверждает, что Parcelize работает с объектами и типами enum.