X 类不是抽象的,没有实现 android.os.Parcelable 中定义的 fun writeToParcel()
Posted
技术标签:
【中文标题】X 类不是抽象的,没有实现 android.os.Parcelable 中定义的 fun writeToParcel()【英文标题】:Class X is not abstract and does not implement fun writeToParcel() defined in android.os.Parcelable 【发布时间】:2019-09-24 21:21:29 【问题描述】:在我的 android 应用程序中,我想将包含下面描述的 Place
对象的 Bundle 添加到我的 Intent 中。由于可序列化很慢且不推荐,因此我更喜欢 Parcelable。
尽管我使用 Kotlin 1.3.31,但我在打包一些数据类时遇到了问题。示例:
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class Place(val street: String, val postal: String, val city: String) : Parcelable
Android Studio 抱怨:
“Place”类不是抽象的,也没有实现抽象成员 public abstract fun writeToParcel(p0: Parcel!, p1: Int): 单位定义 在 android.os.Parcelable
根据一些教程
就是这样!你不再需要编写任何 parcel 方法了!
https://android.jlelse.eu/yet-another-awesome-kotlin-feature-parcelize-5439718ba220
我不想使用
androidExtensions
experimental = true
在生产中。
我在这里有什么选择?
【问题讨论】:
为什么不想使用“experimental = true”?这是它工作的必要条件! 大多数公司不允许在他们的应用程序中使用实验性功能。 JetBrains 必须将其从实验中移出,并且在没有的情况下工作 检查我更新的答案! :D 【参考方案1】:2019 年 11 月 19 日更新
在Kotlin 1.3.60 及其对应的Android Studio 插件稳定发布后,该问题不再存在。 Let's celebrate
2019 年 8 月 27 日更新
在对全新的Kotlin 1.3.50
进行更多研究和测试之后,似乎在他们发布Kotlin 1.3.60
as per this YouTrack issue 时这个问题将最终得到完全解决
编辑 2019 年 6 月 19 日
随着 Kotlin 1.3.40 版本的发布,@Parcelize
注释已不再是实验性的并且工作得很好。唯一的问题是报告的 issue 导致 IDE 变红,而代码确实可以完美编译和运行。
我也用这种对象进行了测试,它也确实有效:
旧答案
我面临着完全相同的问题,在调查时我发现了这个:
所以看起来@Parcelize
注释将从Kotlin 1.3.40
开始完全稳定。在此之前,您必须设置 experimental
标志。 (可悲)
他们错误地将@Parcelize
推送到实验功能之外,您仍然会遇到编译错误。
【讨论】:
(2019 年 11 月 19 日更新后)- 在 3.5.2 AS + 插件和 1.3.60 kotlin 中问题仍然存在 对我来说有效; Android Studio 3.5.2 Kotlin 插件版本:1.3.60-release-Studio3.5.1(稳定更新通道) Android Studio 3.5.2 Build #AI-191.8026.42.35.5977832,构建于 2019 年 10 月 30 日 JRE:1.8.0_202- release-1483-b49-5587405 x86_64 JVM: OpenJDK 64-Bit Server VM by JetBrains sro macOS 10.14.6 照常排除任何缓存。吃完午饭回来就没事了。时间似乎可以治愈所有的伤口 在 Android Studio 4.1.3 版和 Kotlin 1.4.32 版中我也遇到了问题。【参考方案2】:在我的场景中,我已经使用了比 1.3.40
版本最新的 Kotlin 插件版本。
但我仍然得到 Android Studio 错误,编译成功,但 IDE 抱怨 @Parcelize
注释。
也许你也有这个。
这里是解决方案。
检查您在 Gradle 中配置的 kotlin 插件版本是否与 Android Studio 中捆绑的版本相同。
我收到错误是因为我的 Gradle koltin 插件版本是 1.3.61
而 Android Studio 捆绑版本是 1.3.50
如何升级 Kotlin 插件版本?
工具 -> Kotlin -> 配置 kotlin 插件更新
检查最新版本并安装,保持两个版本相同。
【讨论】:
要从 Android Studio 中删除错误警告,这对我来说效果很好。我使用的是 1.3.60 版本。 这很有帮助,尽管在我的情况下,我在 Gradle 文件中指定了旧版本的 Kotlin >_ 【参考方案3】:如果你不想/不能使用实验性,你总是可以只实现 Parcelable(cmd+enter/alt+enter on class name -> `Add Parcelable Implementation" 以便 IDE 为你创建方法模式)扩展。
然而,我已经在 prod 环境中使用@Parcelize 一年多了(尽管经过大量测试),没有任何问题。(只是一个意见,并不是说你应该这样做)
【讨论】:
以上是关于X 类不是抽象的,没有实现 android.os.Parcelable 中定义的 fun writeToParcel()的主要内容,如果未能解决你的问题,请参考以下文章
接口是不是可继承接口? 抽象类是不是可实现(implements)接口? 抽象类是不是可继承实体类(concrete class)?