子类化房间实体

时间:2018-08-15 17:39:07

标签: android kotlin android-room

有没有办法将房间中的实体分类?

我有车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)
}

但是我想将manufacturermodelmodelYear移至Vehicle实体,并让Car继承它。

我尝试使用这些字段创建一个Vehicle实体,并使用data class Car : Vehicle,但是没有编译。错误是This type is final and cannot be inherited

1 个答案:

答案 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