仍然试图在Kotlin中摆脱泛型的困扰,我该怎么写才能避免未经检查的类型转换。
class DBEntityUtil<T:DBEntity, S:Model> {
fun entityListToModelList(entityList:List<T>): List<S>{
val returnList:MutableList<S> = mutableListOf()
entityList.forEach{entity:T ->
returnList.add(entity.toModel() as S)
}
return returnList
}
}
和toModel()
interface IngestsModel {
fun toModel(): Model
}
答案 0 :(得分:3)
S是Model
的任何子类,并且toModel
仅能保证返回Model
。如果您想要S
,则必须强制转换。如果只想使用Model
,则可以删除通用S
,并且使用fun entityListToModelList(...): List<Model>
应该没有问题。
但是,如果要使其像显示的那样工作,则必须使用类似的设置
interface Model
interface DBEntity<S:Model> {
fun toModel(): S
}
将DBEntity
与S
的类型相关联。可以像
class DBEntityUtil<S:Model, T:DBEntity<S>> {
fun entityListToModelList(entityList:List<T>): List<S>{
val returnList:MutableList<S> = mutableListOf()
entityList.forEach{entity:T ->
returnList.add(entity.toModel())
}
return returnList
}
}
并且例如用于
class TestModel: Model
class TestDbEntity : DBEntity<TestModel> {
override fun toModel(): TestModel {
return TestModel()
}
companion object {
val util = DBEntityUtil<TestModel, TestDbEntity>()
fun test() = util.entityListToModelList(listOf(TestDbEntity()))
}
}