提供以下课程
class Foo {
fun bar() {}
}
我可以像这样引用bar
函数
Foo::bar
我希望能够对通用函数执行此操作
class Foo {
fun <T> bar() {}
}
但是编译器会引发以下错误
科特琳:类型推断失败:没有足够的信息来推断fun bar()中的参数T:单位请明确指定。
如何为通用函数引用提供参数?
解决方法1(功能代理)
代理在这里可能是错误的术语,但是除非有人告诉我否则...
我能做的一种方法是 proxy 函数,删除泛型,但这不是一个好方法……
fun Foo.barOfInt() = bar<Int>()
可以正常引用的那个...
Foo::barOfInt
解决方法2(按名称获取)
第二种似乎很成功的方法,尽管它仍然不是很干净,但是它将建立一个KClass<*>
扩展名,该扩展名可以按名称获取该方法...
fun KClass<*>.getGenericFunction(name: String): KFunction<*> {
return members.single { it.name == name } as KFunction<*>
}
我可以这样使用...
Foo::class.getGenericFunction("bar")
答案 0 :(得分:1)
在您的示例中,T
是幻像类型(未在任何地方使用),因此类型推断没有任何可锁住的内容,因此必须明确声明。不幸的是,如References to generic functions中所述,KT-12140仍然是开放的,并且没有使用无点方法引用符号的这种声明的语法。
创建lambda fun (foo: Foo) = foo.bar<Int>()
似乎是您目前最好的选择,尽管仅在签名中的其他地方使用类型T
可能会给类型推断足够的优势,以至于不会必要。