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