如何使用可观察.zip保存类型



我正在尝试将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 类型。在这种非常特殊的情况下,我当然可以投射,但我也有更复杂的类型,如果我能保存类型,我会感觉好得多。我错过了什么吗?

不幸的是,Java(和 Kotlin(类型系统不允许你(或我们的库编写者(进行这样的类型保存; 您必须手动将a Object[]元素转换回各自的类型。

这是使用 2-9 参数zip()重载和 zipWith 实例运算符完成的。

根本问题是无法创建通用数组以及类型擦除本身。如果我们允许在签名中使用Function<T[], R>,我们仍然必须为调用创建new Object[]。但是,您的Function<Integer[], R>实现将尝试将Object[]转换为不允许的Integer[],并且失败并ClassCastException

这在 zip javadoc 中也有描述:

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

最新更新