AIDL 中的 Parcelize 注释:不兼容的类型:Object 无法转换为 MyCustomObject

Posted

技术标签:

【中文标题】AIDL 中的 Parcelize 注释:不兼容的类型:Object 无法转换为 MyCustomObject【英文标题】:Parcelize annotation in AIDL: Incompatible types: Object cannot be converted to MyCustomObject 【发布时间】:2018-11-18 08:54:54 【问题描述】:

我正在将我的模型类重写为 Kotlin,它必须是 Parcelable 并在 AIDL 中使用:

@Parcelize
data class MyCustomObject(val value1: String, val value2: String) : Parcelable

在编译期间它会崩溃并出现错误:

错误:不兼容的类型:对象无法转换为 MyCustomObject

并在生成的代码中指向这一行:

if ((0!=_reply.readInt())) 
    _result = com.mypackagename.MyCustomObject.CREATOR.createFromParcel(_reply);

我将此注释用于其他目的,没关系,但到目前为止我发现在 AIDL 中不匹配。

有什么想法吗?

编辑:5 天后,我创建了 a ticket for this issue,没有任何评论。

【问题讨论】:

它是否适用于 java? 您还有 MyCustomObject.aidl(描述您的数据类的那个吗?) @IvanMilisavljevic,是的,确实如此。我也有那个 object.aidl。 对不起,我还在使用 java,我最好的猜测是 parcelable 生成器和 Kotlin 数据类有问题。您是否尝试清理和重建项目的一个愚蠢建议? @IvanMilisavljevic,是的,以这种方式尝试过。问题在于注释本身。在 kotlin 中可打包的样板也可以正常工作。 【参考方案1】:

这是 Kotlin 中的一个错误,所以我将此问题重定向到 JetBrains。 你可以在这里追踪它:KT-25807。

发生这种情况,因为createFromParcel() 不返回类T,而是Object

UPD

Parcelize 注释现在可由 Google 维护,该问题已在 kotlin 版本 1.5 中得到修复。+ https://issuetracker.google.com/issues/110131003

【讨论】:

AIDL 中使用 parcelized 的辅助工具有什么解决方案吗?有同样的问题 Parcelable 的样板实现。即使优先级设置为“高”,这个错误到目前为止还没有解决...

以上是关于AIDL 中的 Parcelize 注释:不兼容的类型:Object 无法转换为 MyCustomObject的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 数据类中的函数作为参数导致打包错误

Kotlin 一个好用的新功能:Parcelize

未找到插件“kotlin-parcelize”

多个 AIDL 版本

@Parcelize 在多平台项目中

如何在 kotlin @Parcelize 中使用 null