我想将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/

10-10 20:08