Hi, I was trying to write a generic function but encounter a small problem.
The function I wrote is as below.
fun <Y,T1,T2> LiveData<T1>.combineLatest(another:LiveData<T2>,
combiner:(T1,T2) -> Y){
val mediatorData = MediatorLiveData<Y>()
var latestT1: T1? = null
var latestT2: T2? = null
var isT1Ready = false
var isT2Ready = false
mediatorLiveData.addSource(this) { it->
latestT1 = it
isT1Ready = true
if(isT2Ready){
mediator.value = combiner(it,latestT2) // Here would be problem, latestT2 is T2? not T2. So the type does not match.
}
}
......
}
As comment indicated. combiner function would complain about Type mismatch. Combiner was expecting T2 rather than the placeholder’s T2?
And I do not want to use combine(it,latestT2!!). What if T2
is String? in runtime. And User is actually expecting to handle null inside his function?
But I do not want to force user write combiner as (T1?,T2?) -> Y, As the function should ensure the value supplied to combiner function is T1 and T2.
So, is there a way to achieve both?
Or do I need to handle <T1:Any, T2:Any> <T1:Any?,T2:Any?> seperately?
I am sure there should be an elegant way to achieve the result but I checked the generic documents and the content seems not helpful in this situation.
Best regards.