почему я должен бросить это в моем родовом Kotlin - PullRequest
0 голосов
/ 19 октября 2018

все еще пытаюсь овладеть дженериками в 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 голосов
/ 19 октября 2018

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()))
    }
}

https://pl.kotl.in/Bkpc92vjm

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