为什么我要在我的Kotlin泛型中投放

时间:2018-10-19 17:35:54

标签: generics kotlin interface

仍然试图在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
}

1 个答案:

答案 0 :(得分:3)

S是Model的任何子类,并且toModel仅能保证返回Model。如果您想要S,则必须强制转换。如果只想使用Model,则可以删除通用S,并且使用fun entityListToModelList(...): List<Model>应该没有问题。

但是,如果要使其像显示的那样工作,则必须使用类似的设置

interface Model
interface DBEntity<S:Model> {
    fun toModel(): S
}

DBEntityS的类型相关联。可以像

那样使用
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()))
    }
}

https://pl.kotl.in/Bkpc92vjm