Разработка классов и интерфейсов с универсальными типами - PullRequest
0 голосов
/ 12 июня 2018

У меня есть следующий интерфейс, который отображает и принимает в качестве параметра 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()
    }
}

Что было бы лучшим способом для правильной работы с обобщениями?

большое спасибо за любые предложения,

==== ОБНОВЛЕНИЕ Модифицированный интерфейс для дисперсии ввода / вывода:

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 Ответ

0 голосов
/ 13 июня 2018

Так как вам нужен тип in и тип out, вам нужно объявить такие как:

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

Тогда ваш код будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...