Kotlin-泛型函数参考

时间:2019-06-16 16:29:54

标签: kotlin

提供以下课程

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")

1 个答案:

答案 0 :(得分:1)

在您的示例中,T是幻像类型(未在任何地方使用),因此类型推断没有任何可锁住的内容,因此必须明确声明。不幸的是,如References to generic functions中所述,KT-12140仍然是开放的,并且没有使用无点方法引用符号的这种声明的语法。

创建lambda fun (foo: Foo) = foo.bar<Int>()似乎是您目前最好的选择,尽管仅在签名中的其他地方使用类型T可能会给类型推断足够的优势,以至于不会必要。