如何使用Observable.zip?

时间:2018-01-18 14:18:02

标签: kotlin rx-java rx-java2

我试图将Observable.zip应用于可观察列表。它有效,但我希望它能保存类型信息。下面的代码段会出现问题:

    val observable1 = Observable.fromArray(1, 2, 3)
    val observable2 = Observable.fromArray(1, 2, 3)

    // result is a Array<Any>. Could it be an Array<Int> instead ?
    val result = Observable.zip(listOf(observable1, observable2), {a -> a}).blockingFirst()

感觉zip应该能够知道我的项目是Int类型。在这个非常具体的情况下,我当然可以投,但我也有更复杂的类型,如果我能保存类型会感觉好多了。我想念一下吗?

1 个答案:

答案 0 :(得分:4)

不幸的是,Java(和Kotlin)类型系统并不能让你(或我们的图书馆编写者)做这种类型的保存;您必须手动将a Object[]元素转换回各自的类型。

这是通过2-9参数zip() overloadszipWith实例运算符为您完成的。

潜在的问题是,人们无法创建通用数组以及类型擦除本身。如果我们在签名中允许Function<T[], R>,我们仍然需要为调用创建new Object[]。但是,您的Function<Integer[], R>实施会尝试将Object[]投放到Integer[]这是不允许的,并且ClassCastException失败。

这也在zip javadoc中描述:

  

关于方法签名的注意事项:由于Java不允许使用新的T []创建通用数组,因此该运算符的实现必须创建一个Object []。不幸的是,传递给该方法的Function<Integer[], R>将触发ClassCastException。