我试图将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类型。在这个非常具体的情况下,我当然可以投,但我也有更复杂的类型,如果我能保存类型会感觉好多了。我想念一下吗?
答案 0 :(得分:4)
不幸的是,Java(和Kotlin)类型系统并不能让你(或我们的图书馆编写者)做这种类型的保存;您必须手动将a
Object[]
元素转换回各自的类型。
这是通过2-9参数zip()
overloads和zipWith
实例运算符为您完成的。
潜在的问题是,人们无法创建通用数组以及类型擦除本身。如果我们在签名中允许Function<T[], R>
,我们仍然需要为调用创建new Object[]
。但是,您的Function<Integer[], R>
实施会尝试将Object[]
投放到Integer[]
这是不允许的,并且ClassCastException
失败。
这也在zip javadoc中描述:
关于方法签名的注意事项:由于Java不允许使用新的T []创建通用数组,因此该运算符的实现必须创建一个Object []。不幸的是,传递给该方法的
Function<Integer[], R>
将触发ClassCastException。