我們可以很容易地定義一個函式,比如:
fun <T> f1(f2: KFunction<T>) {…}
然后這樣稱呼它:
fun f2() {...}
f1(::f2)
但是當我想這樣稱呼它時:
f1 {
}
它失敗了。因為它需要KFunction<TypeVariable>,但實際上是() -> Unit。
所以我像這樣重寫它:
fun <K, T : Function<K>> f1(args: Array<Any> = arrayOf(), f2: T) {
//f2.invoke(args)
//it failed. I don't know how to call f2
}
f1 {…} //success
所以這就是問題所在。我不知道如何呼叫任意匿名函式型別
我試著這樣稱呼它:
inline fun <K, reified T : Function<K>> f1(args: Array<Any> = arrayOf(), f2: T) {
val typeParams = args.map { it::class.java }.toTypedArray()
T::class.java.getDeclaredMethod("invoke", *typeParams).invoke(f2, args)
// success. But I don't know if there is a bug
}
最后,我發現kotlin.reflect.jvm.Function.reflect()但它現在沒用了。所以我想知道是否有更好的方法來做到這一點。
謝謝你的幫助。
uj5u.com熱心網友回復:
這是我的最終解決方案。它由生成器生成。它看起來很愚蠢,但它非常有用
@Suppress("UNCHECKED_CAST")
fun Function<*>.call(vararg args: Any?): Any? {
return when(this) {
is Function0 -> {
invoke()
}
is Function1<*,*> -> {
(this as Function1<Any?,Any?>).invoke(args[0])
}
is Function2<*,*,*> -> {
(this as Function2<Any?,Any?,Any?>).invoke(args[0],args[1])
}
is Function3<*,*,*,*> -> {
(this as Function3<Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2])
}
is Function4<*,*,*,*,*> -> {
(this as Function4<Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3])
}
is Function5<*,*,*,*,*,*> -> {
(this as Function5<Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4])
}
is Function6<*,*,*,*,*,*,*> -> {
(this as Function6<Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5])
}
is Function7<*,*,*,*,*,*,*,*> -> {
(this as Function7<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6])
}
is Function8<*,*,*,*,*,*,*,*,*> -> {
(this as Function8<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7])
}
is Function9<*,*,*,*,*,*,*,*,*,*> -> {
(this as Function9<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8])
}
is Function10<*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function10<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9])
}
is Function11<*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function11<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10])
}
is Function12<*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function12<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11])
}
is Function13<*,*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function13<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12])
}
is Function14<*,*,*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function14<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13])
}
is Function15<*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function15<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13],args[14])
}
is Function16<*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function16<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13],args[14],args[15])
}
is Function17<*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function17<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13],args[14],args[15],args[16])
}
is Function18<*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function18<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13],args[14],args[15],args[16],args[17])
}
is Function19<*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function19<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13],args[14],args[15],args[16],args[17],args[18])
}
is Function20<*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function20<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13],args[14],args[15],args[16],args[17],args[18],args[19])
}
is Function21<*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function21<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13],args[14],args[15],args[16],args[17],args[18],args[19],args[20])
}
is Function22<*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*,*> -> {
(this as Function22<Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?,Any?>).invoke(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8],args[9],args[10],args[11],args[12],args[13],args[14],args[15],args[16],args[17],args[18],args[19],args[20],args[21])
}
is FunctionN<*> -> {
(this as FunctionN<Any?>).invoke(*args)
}
else -> { throw RuntimeException() }
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/512900.html
標籤:科特林仿制药
