gpt4 book ai didi

generics - 我如何在 Kotlin 中使用具有不同泛型的可变参数?

转载 作者:行者123 更新时间:2023-12-02 13:12:50 25 4
gpt4 key购买 nike

我想将 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类型)

最佳答案

如果要将不同的函数存储在一起,需要处理参数类型Tout方差。这意味着 T仅用于类的输出。实际上,这意味着 Spec<Derived> 的转换-> Spec<Base>是允许的,如果 Derived扩展/实现 Base .

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

例子:

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> , T类型也出现在函数类型的输入中。这意味着您不能再将函数类型存储在一起,因为它们采用不同类型的参数——您将使用哪种类型调用这样的函数?

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

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

关于generics - 我如何在 Kotlin 中使用具有不同泛型的可变参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55692725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com