给定一个函数
fun <T> to5(x: T): Int = 5
是否可以将其分配给变量(值)
funVal
像这样 ?val funVal: (T) -> Int = ::to5
没有
Unresolved reference: T
错误 ?
换句话说,是否有可能以某种方式告诉 Kotlin
T
在 funVal
类型声明是类型参数吗?例如像这样:
val <T> funVal: (T) -> Int = ::to5
val funVal<T>: (T) -> Int = ::to5
val funVal: <T> (T) -> Int = ::to5
val funVal: ((T) -> Int) <T> = ::to5
用例
我的用例是使用泛型的柯里化(Currying)。从概念上讲:
fun pairStrWithStr(s: String): (String) -> Pair<String, String> = {
Pair(s, it)
}
val pairStrWithAbc: (String) -> Pair<String, String> = pairStrWithStr("abc")
pairStrWithAbc("xyz") // (abc, xyz)
使第二个参数通用:
fun <T> pairStrWithAny(s: String): (T) -> Pair<String, T> = {
Pair(s, it)
}
// Compilation ERROR: Unresolved reference: T
val pairAnyWithAbc: (T) -> Pair<String, T> = pairStrWithAny("abc")
我当然可以提供
Any
作为类型:val pairAnyWithAbc: (Any) -> Pair<String, Any> = pairStrWithAny("abc")
但后来我失去了类型信息:
pairAnyWithAbc(5) // Pair<String, Any>
我能想到的解决方案是:
包裹在通用乐趣中 (基本上不是真正的柯里化(Currying)或高阶函数使用)
fun <T> pairAnyWithAbc(t: T) {
return pairAnyWithAbc(t)
}
为每种类型创建函数 (不使用泛型,因为我想)
val pairStrWithAbc: (String) -> Pair<String, String> = pairStrWithAny("abc")
val pairIntWithAbc: (Int) -> Pair<String, Int> = pairStrWithAny("abc")
最佳答案
在 Kotlin 中,只有类和函数可以具有泛型类型参数。如果您确实需要一个属性来具有泛型类型,它必须属于可以提供该泛型类型的类实例,如下所示:
class Foo<T> {
val funVal: (T) -> Int = ::to5
}
有更多关于这个的讨论here ,我只是不能将此标记为重复,因为该问题没有可接受的答案。
关于generics - Kotlin 中的通用 lambda 或函数值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48487689/