You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin value(inline)类加@Parcelize注解编译报错的通用实现方案问询

问题根因

@Parcelize 为内联类自动生成序列化代码时,会直接使用内联类的基础类型(上述示例中为Java基本类型long)作为Parcelable.Creator的泛型参数,而Java泛型不支持传入基本类型,只接受引用类型,因此触发类型不匹配的编译错误。

通用解决方案

方案1:全版本兼容的手动实现方案

手动实现Parcelable接口的相关方法,绕开@Parcelize的自动生成逻辑,所有Kotlin版本均可使用:

@JvmInline
value class TestClass(val value: Long) : Parcelable {
    override fun describeContents(): Int = 0

    override fun writeToParcel(dest: Parcel, flags: Int) {
        dest.writeLong(value)
    }

    companion object CREATOR : Parcelable.Creator<TestClass> {
        override fun createFromParcel(source: Parcel): TestClass = TestClass(source.readLong())
        override fun newArray(size: Int): Array<TestClass?> = arrayOfNulls(size)
    }
}

该方案兼容性最强,无需依赖高版本Kotlin特性,也适配多平台项目场景。

方案2:高版本Kotlin原生支持

如果项目使用 Kotlin 1.8.0及以上版本,@Parcelize已经修复了内联类的序列化问题,你最初的写法可以直接正常编译运行,无需额外修改。

注意事项

  • 手动实现序列化时,需要保证writeToParcel的写入顺序、字段类型和createFromParcel的读取顺序、类型完全一致,否则会出现序列化数据错乱的问题
  • 如果内联类的基础类型是可空类型,读写时需要额外处理空判断逻辑

内容的提问来源于stack exchange,提问作者Casaflowa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:06:08