有没有办法将房间中的实体分类?
我有车entity
@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)
}
但是我想将manufacturer
,model
和modelYear
移至Vehicle
实体,并让Car
继承它。
我尝试使用这些字段创建一个Vehicle
实体,并使用data class Car : Vehicle
,但是没有编译。错误是This type is final and cannot be inherited
答案 0 :(得分:2)
在kotlin
中,默认情况下所有类都是final。
来自Docs
类的开放注释与Java的最终注释相反:它 允许其他人从此类继承。
By default, all classes in
Kotlin are final
,与有效Java第三版相对应, 第19项:为继承而设计或记录文件,否则将禁止继承。
因此您需要添加open
关键字,以便使用
open class Vehicle(..){...}
然后
data class Car(...): Vehicle(..){}
侧面注意:如果您尝试继承data
类,那么您就不能继承Kotlin中的data
类,因为数据类中的copy
之类的方法是最终的,子类无法覆盖类(在这种情况下为data
类,因此它将自动执行),并且当类层次结构随着不同的数据成员呈指数增长时,很难实现其他方法,例如equals
,尽管您可以通过设置非数据父类或abstract
类