Как добавить общий подтип в список общих супертипов? - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь создать список свойств конфигурации, каждое из которых имеет имя и значение типа Any. Это может быть Number, String, Bool, Enum и т. Д. У меня проблемы с добавлением нового GameConfigProp в список.

data class GameConfigProp<T>(val name : String, var value : T)

private val configProps = mutableListOf<GameConfigProp<Any>>()


    fun <T> addProp(name: String, value: T) : GameConfigProp<T>{
        val p = GameConfigProp(name, value)
        configProps.add(p)
        return p
    }

configProps.add (p) выдает ошибку времени компиляции:

Type mismatch.
Required: GameConfigProp<Any>
Found: GameConfigProp<T>

1 Ответ

0 голосов
/ 05 июля 2019

Необходимо указать, что параметр универсального типа T расширяет тип Any.Если не указано иное, компилятор предполагает, что допускается также значение NULL Any?.Но ваши реквизиты допускают только те типы, которые не допускают обнуления.И вам нужно указать out как тип проекции для вашего списка configProps:

private val configProps = mutableListOf<GameConfigProp<out Any>>()

fun <T : Any> addProp(name: String, value: T) : GameConfigProp<T>{
    val p = GameConfigProp(name, value)
    configProps.add(p)
    return p
}

Теперь он будет скомпилирован.Но учтите, что все методы, для которых требуется T со стороны in - GameConfigProp, не будут доступны для элементов вашего списка configProps, например, configProps[1].value = ... не скомпилирует

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