[英]Compile time error in passing vararg parameter to another function in Kotlin
[英]kotlin reference function with vararg parameter and convert Array<out to List<out
我已經根據這個主題基本問題提出了問題
所以,我想提前問一下。 有人用數組和列表回答了這個問題
Class Test<T,V>{
var functionPara :(()->T)? = null
var recallFunctionWithFunction:( (Array<out T>) -> V)? = null
constructor(value: ()->T, recallFunctionWithFunction: (Array<out T>) -> V ){
this.functionPara = value
this.recallFunctionWithFunction = recallFunctionWithFunction
}
inline fun <reified T, V> compose(crossinline f: (Array<out T>) -> V, vararg g: () -> T): () -> V {
val results = g.map { it() }
return { f(results.toTypedArray()) }
}
fun <T, V> compose(f: (List<out T>) -> V, vararg g: () -> T): () -> V {
val results = g.map { it() }
return { f(results) }
}
}
fun runCompose(){
compose(functionPara,recallFunctionWithFunction).invoke()
}
但我發現,當我引用帶有 vararg 參數的 function 時
fun functionA(vararg :Observable<Any>):LiveData<Boolean>{
}
fun functionB():Observable<Any>{
}
當我執行類似::functionA 的操作時,A 的類型將是Array<out Observable<Any>>->LiveData<Boolean>
因此,當我執行類似操作時
Test<Observable<Any>,LiveData<Boolean>>(::functionB,::functionA).runCompose()
情況 1如果我使用 compose function 並接受 List 類型,它將顯示類型不匹配,因為引用::functionA 將返回 Array
情況 2如果我使用 compose function 並接受 Array 類型,它將顯示錯誤
不能使用“T”作為具體類型參數。 改用 class
在上一篇文章中,有人回答我將數組轉換為列表。 但是如何將引用 function 與 vararg 參數與原始Array<out to List <out
? 當我引用 function 之類的 function 時,類型必須是Array<out
但我想將其插入到 compose function 中。 我必須轉換它。 任何人都可以幫忙嗎? 我在那兒呆了很長時間。 希望有人能救我!!
由於類型擦除,您無法將列表轉換為類型化數組。 我認為最簡單的方法是在任何地方使用List
。
class Test<T, V>(val recallFunctionWithFunction: (List<T>) -> V, val functionPara: () -> T) {
inline fun compose(crossinline f: (List<T>) -> V, vararg g: () -> T): () -> V {
return { f(g.map { it.invoke() }) }
}
fun runCompose() {
compose(recallFunctionWithFunction, functionPara).invoke()
}
}
fun functionA(l: List<Observable<Any>>): LiveData<Boolean> {
...
}
fun functionB(): Observable<Any> {
...
}
另一種解決方案
class Test<T, V>(
val recallFunctionWithFunction: (Array<out T>) -> V,
val functionPara: () -> T,
val clazz: Class<T>
) {
companion object {
inline fun <reified T, V> create(
noinline recallFunctionWithFunction: (Array<out T>) -> V,
noinline functionPara: () -> T
) = Test(recallFunctionWithFunction, functionPara, T::class.java)
}
inline fun compose(crossinline f: (Array<out T>) -> V, vararg g: () -> T): () -> V {
return {
@Suppress("UNCHECKED_CAST")
val arr = java.lang.reflect.Array.newInstance(clazz, g.size) as Array<T>
g.forEachIndexed { index, fg -> arr[index] = fg.invoke() }
f(arr)
}
}
fun runCompose() {
compose(recallFunctionWithFunction, functionPara).invoke()
}
}
...
val t = Test.create(::functionA, ::functionB)
t.runCompose()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.