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)?

Android中的倒计时实现

abstract class与 interfacer

接口,抽象类与内部类

抽象类和抽象方法

抽象类和接口的区别