如何将泛型子类型添加到泛型超类型列表中?

时间:2019-07-05 04:47:17

标签: generics kotlin

我正在尝试创建一个配置属性列表,每个配置属性都有一个名称和一个Any类型的值。可能是数字,字符串,布尔,枚举等。我在向列表中添加新的GameConfigProp时遇到问题。

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

configProps.add(p)抛出编译时错误:

USHRT_MAX

1 个答案:

答案 0 :(得分:0)

您必须指定通用类型参数T扩展Any类型。 如果未指定,则编译器会假定也可以使用可为空的Any?。 但是您的道具只允许使用不能为null的类型。 并且您需要将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
}

现在它将编译。但请注意,in列表中的元素无法访问GameConfigProp的{​​{1}}-侧需要T的所有方法。 configProps无法编译