簡體   English   中英

kotlin 參考 function 帶可變參數並轉換數組<out to list<out< div><div id="text_translate"><p> 我已經根據這個主題<a href="https://stackoverflow.com/questions/62260177/kotlin-geneirc-with-vararg-parameter" rel="nofollow noreferrer">基本問題提出了問題</a></p><p>所以,我想提前問一下。 有人用數組和列表回答了這個問題</p><pre>Class Test&lt;T,V&gt;{ var functionPara:(()-&gt;T)? = null var recallFunctionWithFunction:( (Array&lt;out T&gt;) -&gt; V)? = null constructor(value: ()-&gt;T, recallFunctionWithFunction: (Array&lt;out T&gt;) -&gt; V ){ this.functionPara = value this.recallFunctionWithFunction = recallFunctionWithFunction } inline fun &lt;reified T, V&gt; compose(crossinline f: (Array&lt;out T&gt;) -&gt; V, vararg g: () -&gt; T): () -&gt; V { val results = g.map { it() } return { f(results.toTypedArray()) } } fun &lt;T, V&gt; compose(f: (List&lt;out T&gt;) -&gt; V, vararg g: () -&gt; T): () -&gt; V { val results = g.map { it() } return { f(results) } } } fun runCompose(){ compose(functionPara,recallFunctionWithFunction).invoke() }</pre><p> 但我發現,當我引用帶有 vararg 參數的 function 時</p><pre>fun functionA(vararg:Observable&lt;Any&gt;):LiveData&lt;Boolean&gt;{ } fun functionB():Observable&lt;Any&gt;{ }</pre><p> 當我執行類似::functionA 的操作時,A 的類型將是Array&lt;out Observable&lt;Any&gt;&gt;-&gt;LiveData&lt;Boolean&gt;因此,當我執行類似操作時</p><p>Test&lt;Observable&lt;Any&gt;,LiveData&lt;Boolean&gt;&gt;(::functionB,::functionA).runCompose()</p><p> <strong><em>情況 1</em></strong>如果我使用 compose function 並接受 List 類型,它將顯示類型不匹配,因為引用::functionA 將返回 Array</p><p><img src="https://i.stack.imgur.com/X3k3A.png" alt="圖片1"></p><p> <strong><em>情況 2</em></strong>如果我使用 compose function 並接受 Array 類型,它將顯示錯誤</p><p>不能使用“T”作為具體類型參數。 改用 class</p><p><img src="https://i.stack.imgur.com/Z2iwJ.png" alt="圖片2"></p><p> 在上一篇文章中,有人回答我將數組轉換為列表。 但是如何將引用 function 與 vararg 參數與原始Array&lt;out to List &lt;out ? 當我引用 function 之類的 function 時,類型必須是Array&lt;out但我想將其插入到 compose function 中。 我必須轉換它。 任何人都可以幫忙嗎? 我在那兒呆了很長時間。 希望有人能救我!!</p></div></out>

[英]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

圖片1

情況 2如果我使用 compose function 並接受 Array 類型,它將顯示錯誤

不能使用“T”作為具體類型參數。 改用 class

圖片2

在上一篇文章中,有人回答我將數組轉換為列表。 但是如何將引用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM