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
相关产品推荐
相关产品推荐

