是否有可能参考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)
本质上,您必须定义属性类型,然后将通用函数放入其中。就像麦克斯在问题的评论部分提到的那样。
// 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)