对泛型函数的引用

Cur*_*vus 7 generics kotlin

是否有可能参考Kotlin中的通用函数?

例如,假设我有一个函数:

fun inline <reified T> appendToString(a: T, b: T) = a.toString() + b.toString
Run Code Online (Sandbox Code Playgroud)

你怎么能参考这个功能?这不会编译

var a = ::appendToString<Int>
Run Code Online (Sandbox Code Playgroud)

dae*_*tus 11

目前它不受支持.但是,如果您希望看到它实现,可以支持功能请求:) KT-12140


Hao*_*min 7

本质上,您必须定义属性类型,然后将通用函数放入其中。就像麦克斯在问题的评论部分提到的那样。

// generic function
fun <T> appendToString(a: T, b: T) = a.toString() + b.toString()

// Failed, since cannot type inference
val temp = ::appendToString

// Failed, invalid syntax, since you cannot use type parameters this way
val temp2 = ::appendToString<String, String>

// Success, valid syntax to define type, unlike previous temp2 example, and resolved the type inference issue in temp1, since you spelled it out for the compiler
val temp3: (String, String) -> String = ::appendToString
Run Code Online (Sandbox Code Playgroud)

typealias或者,如果您使用函数作为参数,您可以使用来解决此问题:

typealias TypedAppendToString = (String, String) -> String

fun <T> appendToString(a: T, b: T) = a.toString() + b.toString()

fun refToFunction(appendToString: TypedAppendToString) {
    appendToString.invoke("daf", "daf")
}

fun main() {
    refToFunction(::appendToString)
}
Run Code Online (Sandbox Code Playgroud)