可以与android房间实体使用泛型吗?



考虑以下Entity:

@Entity(tableName = "media")
data class Media(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
// Stored as a JSON blob in SQLite using some TypeAdapter magic
val content: Content,
) {
sealed class Content {
data class Image(val width: Int, val height: Int): Content()
data class Video(val framerate: Int): Content()
}
}

要访问Media.Content.Image.width,我必须执行

val media: Media = // { ... } - returns image media
(media.content as Media.Content.Image).width

这个很快就过时了,似乎很容易出错。

使用泛型,我可以做如下的事情:
@Entity(tableName = "media")
data class Media<T: Media.Content>(
@PrimaryKey(autoGenerate = true) val id: Long = 0,
val content: T,
) {
sealed class Content {
data class Image(val width: Int, val height: Int): Content()
data class Video(val framerate: Int): Content()
}
}
val media: Media<Media.Content.Image> = // { ... } - returns image media
media.content.width

然而,这种风格似乎有问题:

error: Cannot use unbound fields in entities.
private final T content = null;
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
private final T content = null;

我不确定T的TypeConverter会是什么样子-是否有办法让房间处理这种类型的泛型,或者它根本不支持?

为什么不使用一个具体化的内联方法来处理类型强制转换呢?因为编译器已经没有任何类型安全保证了。

更好的方法是序列化类型并使用switch语句来处理所有可能的返回类型

inline fun <reified T> Media.contentAccess(): T {
return this.content as T
}
val media: Media = Media(id = 1, content = Media.Content.Image(width = 1, height = 1))
media.contentAccess<Media.Content.Image>().width

最新更新