我想将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中的类型时,如何将vararg与不同的泛型一起使用? (pair.first类型取决于pair.second类型)
最佳答案
不要使用Pair
,而是考虑定义自己的类型:
class WithSpec<P, T>(val prop: P?, val funCreateSpec: (P) -> Specification<T>) {
fun spec() = prop?.let(funCreateSpec)
}
为什么?因为它可以让你做
class GeneralSpecification<T> {
fun ifNotNullCreateSpec(vararg propToCreateFun: WithSpec<*, T>): List<Specification<T>> =
propToCreateFun.mapNotNull { it.spec() }
...
}
ifNotNullCreateSpec(WithSpec("asdf", ::createStringSpec), WithSpec(5, ::createIntSpec))
如果您想更接近原始代码,可以轻松添加类似于
to
的扩展函数,返回WithSpec
。如果您不知道
*
是什么意思,请参见https://kotlinlang.org/docs/reference/generics.html#star-projections。关于generics - 如何在Kotlin中将vararg与不同的泛型一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55692725/