我想将 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(使用前将#替换为@)