Правильное использование ковариант и контравариант в kotlin для дерева - PullRequest
0 голосов
/ 14 января 2020

Привет общение stackoverflow,

Я написал метод с использованием обобщенных c типов. И у меня странное ощущение, что это немного сложно. На inte rnet я нашел концепцию контрастной дисперсии и дисперсии для обобщенных c типов. Но мои попытки сделать это правильно не увенчались успехом. Есть ли способ избавиться от второго (избыточного) универсального c Типа K?

fun <T, K> add(item: TreeItem<K>, startParent: TreeItem<T>, levelIndices: List<Int>) where K : T {
    var currentParent = startParent
    for ((counter, levelIndex) in levelIndices.withIndex()) {
        if (counter == levelIndices.size - 1) {
            @Suppress("UNCHECKED_CAST")
            currentParent.children.add(levelIndices.last(), item as TreeItem<T>)
            break
        }
        val positionEntryController = currentParent.children[levelIndex].value
        if (positionEntryController is PositionHeaderController) {
            currentParent = currentParent.children[levelIndex]
        } else {
            throw NotImplementedError()
        }
    }
}

Важнейшая строка находится под @Suppress("UNCHECKED_CAST"), где я должен явным образом привести.

1 Ответ

0 голосов
/ 14 января 2020

Я думаю, что это должно позволить вам удалить актерский состав

fun <T> add(item: TreeItem<in T>, startParent: TreeItem<T>, levelIndices: List<Int>) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...