Проектирование классов и интерфейсов с универсальными типами
у меня есть следующий интерфейс, который отображает и принимает в качестве параметра a 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>
}
Я пытаюсь получить свой класс, который реализует это, используя общую версию интерфейса, однако я получаю много ошибок по теме:
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
класс, реализующий интерфейс
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()
}
}
каков был бы лучший способ заставить это работать правильно с дженериками?
большое спасибо за любые предложения,
==== обновление Модифицированный интерфейс для IN / out дисперсии:
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);
1 ответов
Так как вы хотите in
тип и элемент out
введите, что вам нужно объявить такие:
interface InsectInteractorMapper<in T1, out T2> {
fun map(insectTypesEntity: T1): T2
fun map(cursor: Cursor): List<T2>
}
тогда ваш код будет работать