RxJava中Observable.zip合并Observable<List<Int>>列表参数报错问题
解决RxJava Observable.zip 参数不匹配问题
你遇到的问题根源在于Java泛型擦除导致的类型不兼容。RxJava中Observable.zip接受Iterable<ObservableSource<?>>的重载方法,其对应的Function参数在编译后会被擦除为Object[],而你定义的Function<Array<List<Int>>, List<Int>>类型无法与这个擦除后的类型匹配,所以编译器报错。
下面是修正后的完整代码:
fun testObservablezip() { // 简化jobs的创建方式,用map替代循环添加 val jobs = (0 until 100 step 10).map { i -> Observable.fromArray(listOf(i + 1, i + 2, i + 3)) } // 修改Function的参数类型为Object[],并在内部安全转型 val listMerger = Function<Object[], List<Int>> { array -> array.flatMap { it as List<Int> } } // 现在zip方法可以正常接受参数了 val mergedObservable = Observable.zip(jobs, listMerger) // 可选:订阅合并后的Observable,处理结果 mergedObservable.subscribe { mergedList -> println("合并后的列表:$mergedList") } }
补充说明:
- 泛型擦除的影响:由于Java虚拟机无法在运行时保留泛型的具体类型信息,
zip方法只能将所有Observable发射的结果打包成Object[]传递给合并函数,因此我们需要手动将每个元素转型为List<Int>。 - 类型安全保障:确保你所有的
Observable<List<Int>>都确实只会发射List<Int>类型的数据,否则转型时会抛出ClassCastException。 - 替代方案:如果你使用RxJava 2及以上版本,也可以使用
Observable.zipIterable方法,它的签名更直观,效果完全一致:val mergedObservable = Observable.zipIterable(jobs) { array -> array.flatMap { it as List<Int> } }
内容的提问来源于stack exchange,提问作者Steven Lang
相关产品推荐
相关产品推荐

