如何在 Kotlin 中将 vararg 与不同的泛型一起使用?

2023-12-27

我想将 vararg 与每个参数具有不同类型的泛型一起使用

我已经尝试过的:

class GeneralSpecification<T> {
    fun <P> ifNotNullCreateSpec(vararg propToCreateFun: Pair<P?, (P) -> Specification<T>>): List<Specification<T>> = 
       propToCreateFun.mapNotNull { (prop, funCreateSpec) ->
            prop?.let(funCreateSpec)
    }
...
}

但我不能这样使用它:

ifNotNullCreateSpec("asdf" to ::createStringSpec, 5 to ::createIntSpec)

(可变参数对中的不同类型)

当我需要限制 vararg 中的类型时,如何将 vararg 与不同的泛型一起使用? (pair.first 类型取决于pair.second 类型)


如果要将不同的函数存放在一起,需要处理参数类型T with out方差。这意味着T仅用于output班级的。在实践中,这意味着Spec<Derived> -> Spec<Base>是允许的,如果Derived扩展/实现Base.

如果没有这样的约束,函数类型是不相关的,因此您不能将它们存储在公共数组中(可变参数只是数组参数的语法糖)。

Example:

class Spec<out T>

fun createStringSpec() = Spec<String>()
fun createIntSpec() = Spec<Int>()

fun <T> ifNotNullCreateSpec(vararg pairs: Pair<T, () -> Spec<T>>) = Unit

fun main() {
    ifNotNullCreateSpec("asdf" to ::createStringSpec, 5 to ::createIntSpec)
}

带参数T比如在(T) -> Spec<T>, the T类型也出现在input的函数类型。这意味着您不能再将函数类型存储在一起,因为它们采用不同类型的参数——您将使用哪种类型来调用这样的函数?

您在这里需要做的是找到最常见的分母。一个例子是接受Any参数并对实际类型进行运行时检查/调度。

另请参阅我最近的回答:https://stackoverflow.com/a/55572849 https://stackoverflow.com/a/55572849

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Kotlin 中将 vararg 与不同的泛型一起使用? 的相关文章

随机推荐