簡體   English   中英

有沒有辦法在vararg參數中保留類型?

[英]Is there a way to preserve the types in a vararg parameter?

我的問題是可以做類似的事情:

fun <T, R> someFunction(vararg sources<out T>, doSomething: (vararg sources<out T>) -> R) {
    // do something here
}

所以,如果我做類似的事情:

someFunction(SomeType<A>(), SomeType<B>(), SomeType<C>()) { a: A, b: B c: C ->
    // do Something
}

基本上,高階函數需要所有參數類型。

我之所以這樣問,是因為我想簡化如下代碼:

inline fun <T1, T2, R> MediatorLiveData<out R>.merge(source1: LiveData<out T1>, source2: LiveData<out T2>, crossinline merger: (T1?, T2?) -> R?) {
    addSource(source1) {
        this.value = merger.invoke(source1.value, source2.value)
    }
    addSource(source2) {
        this.value = merger.invoke(source1.value, source2.value)
    }
}

inline fun <T1, T2, T3, R> MediatorLiveData<out R>.merge(source1: LiveData<out T1>, source2: LiveData<out T2>, source3: LiveData<out T3>, crossinline merger: (T1?, T2?, T3?) -> R?) {
    addSource(source1) {
        this.value = merger.invoke(source1.value, source2.value, source3.value)
    }
    addSource(source2) {
        this.value = merger.invoke(source1.value, source2.value, source3.value)
    }
    addSource(source3) {
        this.value = merger.invoke(source1.value, source2.value, source3.value)
    }
}

inline fun <T1, T2, T3, T4, R> MediatorLiveData<out R>.merge(source1: LiveData<out T1>, source2: LiveData<out T2>, source3: LiveData<out T3>, source4: LiveData<out T4>, crossinline merger: (T1?, T2?, T3?, T4?) -> R?) {
    addSource(source1) {
        this.value = merger.invoke(source1.value, source2.value, source3.value, source4.value)
    }
    addSource(source2) {
        this.value = merger.invoke(source1.value, source2.value, source3.value, source4.value)
    }
    addSource(source3) {
        this.value = merger.invoke(source1.value, source2.value, source3.value, source4.value)
    }
    addSource(source4) {
        this.value = merger.invoke(source1.value, source2.value, source3.value, source4.value)
    }
}

有人可以建議嗎? 提前致謝!

試用以下功能:

fun <T, R> someFunction(vararg sources: LiveData<out T>, doSomething: (sources: Array<out LiveData<out T>>) -> R) {
    // ...

    doSomething(sources)
}

似乎我們不能在lambda表達式doSomething使用修飾符vararg ,將其替換為Array

編輯:因此,基本上,您將能夠對不同數量的源執行以下操作,而無需在示例中創建其他功能:

fun <T, R> someFunction(vararg sources: LiveData<out T>, doSomething: (sources: Array<out LiveData<out T>>) -> R) {
    sources.forEach {
        addSource(it) {
            doSomething.invoke(sources)
        }
    }
}

// Call someFunction with different number of args:
val l1: LiveData<Int> = MutableLiveData()
val l2: LiveData<String> = MutableLiveData()
val l3: LiveData<String> = MutableLiveData()

// Call with two args:
someFunction(l1, l2) { sources: Array<out LiveData<out Any>> ->
    val data1 = sources[0] as LiveData<Int>
    val data2 = sources[1] as LiveData<String>
    // do your work here   
}
// Or Call with three args:
someFunction(l1, l2, l3) { sources: Array<out LiveData<out Any>> ->
    val data1 = sources[0] as LiveData<Int>
    val data2 = sources[1] as LiveData<String>
    val data3 = sources[2] as LiveData<String>
    // do your work here   
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 android rxjava2 zip 可變參數 將vararg參數傳遞給Kotlin中的另一個函數時編譯時間錯誤 如何在Kotlin的枚舉中檢索用vararg聲明的參數的值 無法解析在擴展函數中提供給vararg參數的字符串 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> 在 function 中使用 varargs 參數時,我得到“僅允許在帶括號的參數列表內將值作為 vararg 傳遞” 在android中有什么方法可以在卸載后保留SharedPreferences kotlin 中的字符串格式和可變參數 kotlin 中的 vararg 沒用嗎? 如何在 Timber 的 vararg 中插入 arguments?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM