我无法使用@parcelize注释创建通用结构togother。我希望构造函数用作 Jason、Room 和 Parcelable 的构造。
假设我们有类
@Parcelize
class Food(var taste: String = "")
现在我想到的两个解决方案
1.抱怨味道必须是var或val,才能有可用的Parceable构造函数
@Parcelize
class FastFood(var callory:String = "", taste: String): Food(taste) // error
2.抱怨我必须明确地卵化物味道 - 那么多态性有什么好处?
@Parcelize
class FastFood(var callory: String = "", var taste: String): Food(taste) // error
如何与你们的库一起使用高效继承?
在 Kotlin 中,如果您在构造函数 'val' 或 'var' 中添加值,它将成为类属性。要使用Parceable,您需要添加它,因为没有它,Parcelable.Creator无法访问它。然后,您需要将"open"修饰符添加到食品类和属性"味道"中,因为在 Kotlin 中默认情况下都是最终的,因此您将能够覆盖口味值。
@Parcelize
open class Food(open val taste: String)
@Parcelize
class FastFood(var callory:String = "", override val taste: String): Food(taste)
我无法使用@Parcelize找到完美的解决方案,但是有两种略有缺陷的方法。
1(使基类抽象,只在子类中使用@Parcelize。这意味着您不能拥有父级的实例,但有时这很好。如果你有能力这样做,这是一个有效的解决方案。
abstract class Food : Parcelable {
abstract var taste: String
}
@Parcelize
class FastFood(var callory: String = "", override var taste: String = "") : Food()
2(也许你需要能够制作父项的实例。执行此操作的一种方法是使基类不是父类,而是父类和子类的父类。不幸的是,这稍微弄乱了类的层次结构,快餐将不是一种食物,而是两者都是一种基础食物。
abstract class BaseFood : Parcelable {
abstract var taste: String
}
@Parcelize
class Food(override var taste: String = "") : BaseFood()
@Parcelize
class FastFood(var callory: String = "", override var taste: String = "") : BaseFood()
截至 2021 年 12 月,问题仍然存在,我无法将继承与@Parcelize
一起使用父类:
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
open class Parent (
var parentString : String
) : Parcelable {
constructor(): this("")
}
子类(继承父类(
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class Child (
var childString : String
) : Parent(), Parcelable {
constructor() : this("")
}
我正在将子类对象从活动 A 发送到活动 B
活动 A 代码:(发件人(
val child = Child()
child.childString = "THIS IS CHILD"
child.parentString = "THIS IS PARENT"
val intent = Intent(this, ActivityB::class.java)
val bundle = Bundle()
bundle.putParcelable("parcel", child)
intent.putExtra("bundle", bundle)
startActivity(intent)
活动 B 代码:(接收方(
val bundle = intent.getBundleExtra("bundle")
val child = bundle?.getParcelable<Child>("parcel") as Child
Log.e("Child Class c", child.childString) //THIS IS CHILD
Log.e("Parent Class p", child.parentString) //"" <- issue
child.parentString = ">,而不是这是父级,这是一个@Parcelize的问题
根据YouTrack问题的建议,我设法使用了一种基于interface
声明的解决方法,如下所示:
interface MyInterface {
val value01: String
val value02: String
}
@Parcelize
data class Child01(
override val value01: String,
override val value02: String
) : MyInterface, Parcelable
@Parcelize
data class Child02(
override val value01: String,
override val value02: String
) : MyInterface, Parcelable