Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 子类化房间实体_Android_Kotlin_Android Room - Fatal编程技术网

Android 子类化房间实体

Android 子类化房间实体,android,kotlin,android-room,Android,Kotlin,Android Room,有没有一种方法可以对房间中的实体进行子类化 我有一辆车实体 @Entity(tableName = "cars") data class Car( @PrimaryKey @ColumnInfo(name = "vin") val vin: String, val manufacturer: String, val model: String, val color: String, val modelYear: In

有没有一种方法可以对房间中的实体进行子类化

我有一辆车
实体

@Entity(tableName = "cars")
data class Car(
        @PrimaryKey @ColumnInfo(name = "vin") val vin: String,
        val manufacturer: String,
        val model: String,
        val color: String,
        val modelYear: Int,
        val trim: String = ""
) {

    override fun toString() = String.format("%s %s %s %s", modelYear, manufacturer, model, trim)
}
但是我想将
制造商
车型
modelYear
移动到
车辆
实体,并使
汽车
继承自该实体


我尝试用这些字段创建一个
Vehicle
实体,并使用
数据类Car:Vehicle
,但没有编译。错误是
此类型为最终类型,不能在
kotlin
中继承,默认情况下所有类均为最终类

类上的open注释与Java的final相反:it 允许其他人从此类继承<默认情况下,代码>中的所有类
Kotlin是最终版本
,对应于有效的Java,第3版, 第19项:继承或禁止的设计和文件

因此,您需要添加
open
关键字,以便使用

open class Vehicle(..){...}
然后


旁注:如果您试图继承
数据
类,那么您就不能在Kotlin中继承
数据
类,因为数据类中类似
复制
的方法是最终的,不能被子类覆盖(在这种情况下,子类是
数据
类,因此它将自动执行此操作)当类层次结构随着不同的数据成员呈指数增长时,很难实现其他方法,如
equals
,尽管您可以通过创建非数据父类或
抽象类来避免所有这些冲突。我刚在另一篇SO帖子上读到同样的东西。我想我可以使用
摘要
,但它没有提供我所希望的好处。为什么会这样设计或仅仅是Kotlin限制?是的,对于抽象来说,它只是一种
Is-a
关系,对于数据类继承,一个原因是复制方法重写不可能,另一个原因是相等不可能,请参见示例
数据类载体(val模型:String);数据类FutureCar(val发动机:FancyEngine,val车身:BodyBuilderFactory,val车型:String):车辆档案(车型)因此,在这种情况下,很难实现默认情况下与
车辆
类的其他子类相等的值,尽管允许重写,但规范设计者认为这可能会破坏拥有数据类的目的,并增加更多含义
data class Car(...): Vehicle(..){}