Мой вопрос: можно сделать что-то вроде:
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)
}
}
Может кто-нибудь предложить что-нибудь? Заранее спасибо!