gpt4 book ai didi

generics - 使用泛型类型设计类和接口(interface)

转载 作者:IT老高 更新时间:2023-10-28 13:42:03 28 4
gpt4 key购买 nike

我有以下接口(interface)映射和接受作为参数的InsectTypesEntity并返回 InsectDataModel 的对象另一个返回 List<InsectDataModel>

我正在尝试使用泛型来做到这一点,因为我想练习这个。

interface InsectInteractorMapper<T> {
fun map(insectTypesEntity: T): T
fun map(cursor: Cursor): List<T>
}

如果没有泛型,它会是这样的:

interface InsectInteractorMapper<InsectTypesEntity> {
fun map(insectTypesEntity: InsectTypesEntity): InsectDataModel
fun map(cursor: Cursor): List<InsectDataModel>
}

我试图让我的类使用接口(interface)的通用版本来实现这一点,但是,我得到了很多相关的错误:

1) Return type is 'insectDataModel' which is not a subtype of overridden
public abstract fun map(insectTypesEntity: InsectTypesEntity): InsectTypeEntity defined in InsectInteractorMapper

2) Return type is 'List<InsectDataModel>' which is not a subtype of overridden
public abstract fun map(cursor: Cursor): List<InsectTypesEntity> defined in InsectInteractorMapper

实现接口(interface)的类

class InsectInteractorMapperImp: InsectInteractorMapper<InsectTypesEntity> {
override fun map(insectTypesEntity: InsectTypesEntity): InsectDataModel {

return InsectDataModel(
insectTypesEntity.friendlyName,
insectTypesEntity.scientificName,
insectTypesEntity.classification,
insectTypesEntity.imageAsset,
insectTypesEntity.dangerLevel)
}

override fun map(cursor: Cursor): List<InsectDataModel> {
val insectDataModelList: MutableList<InsectDataModel> = mutableListOf()

cursor.moveToFirst()
while(cursor.moveToNext()) {
InsectDataModel().let {
it.friendlyName = cursor.getString(cursor.getColumnIndexOrThrow(InsectContract.COLUMN_FRIENDLY_NAME))
it.scientificName = cursor.getString(cursor.getColumnIndexOrThrow(InsectContract.COLUMN_SCIENTIFIC_NAME))
it.dangerLevel = cursor.getInt(cursor.getColumnIndexOrThrow(InsectContract.COLUMN_DANGER_LEVEL))

insectDataModelList.add(it)
}
}

cursor.close()
return insectDataModelList.toList()
}
}

使用泛型使其正常工作的最佳方法是什么?

非常感谢您的任何建议,

==== 更新输入/输出差异的修改界面:

interface InsectInteractorMapper<in E, out M> {
fun map(insectTypesEntity: E): M
fun map(cursor: Cursor): List<M>
}

但是,当我尝试使用界面时收到警告:

unchecked assignment java.util.List to java.util.List<InsectDataModel> Reason insectDataModelMapper has raw type so result of map will be erased 

当我这样使用它时:

insectInteractorMapper = new InsectInteractorMapperImp();
insectDataModelList = insectInteractorMapper.map(cursor);

最佳答案

既然你想要一个 in 类型和一个 out 类型,你需要像这样声明它们:

interface InsectInteractorMapper<in T1, out T2> {
fun map(insectTypesEntity: T1): T2
fun map(cursor: Cursor): List<T2>
}

那么你的代码就可以工作了

关于generics - 使用泛型类型设计类和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50821549/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com