Kotlin 如何使用Observable.zip保存类型?

Kotlin 如何使用Observable.zip保存类型?,kotlin,rx-java,rx-java2,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 ? va

我正在尝试将
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()
val observable1=可观测。来自数组(1,2,3)
val Observable 2=可观测。来自数组(1,2,3)
//结果是一个数组。它可能是一个数组吗?
val result=Observable.zip(listOf(observable1,observable2),{a->a}).blockingFirst()
感觉好像
zip
应该能够知道我的项目是Int类型的。在这个非常特殊的情况下,我当然可以强制转换,但我也有更复杂的类型,如果我可以保留类型,我会感觉更好。我错过了什么吗?

不幸的是,Java(和Kotlin)类型系统不允许您(或我们的库作者)进行此类类型保存;您必须手动将
a
对象[]
元素回溯到它们各自的类型

这是通过2-9参数
zip()
zipWith
实例操作符完成的

潜在的问题是,不能像创建类型擦除本身那样创建泛型数组。如果我们在签名中允许
函数
,我们仍然必须为调用创建
新对象[]
。但是,您的
函数
实现将尝试将
对象[]
强制转换为
整数[]
,这是不允许的,并且会因
ClassCastException
而失败

这在zip中也有描述:

关于方法签名的注意事项:由于Java不允许使用新的t[]创建泛型数组,因此该操作符的实现必须创建一个对象[]。不幸的是,传递给该方法的
函数将触发ClassCastException

不幸的是,Java(和Kotlin)类型系统不允许您(或我们的库编写者)进行此类类型保存;您必须手动将
a
对象[]
元素回溯到它们各自的类型

这是通过2-9参数
zip()
zipWith
实例操作符完成的

潜在的问题是,不能像创建类型擦除本身那样创建泛型数组。如果我们在签名中允许
函数
,我们仍然必须为调用创建
新对象[]
。但是,您的
函数
实现将尝试将
对象[]
强制转换为
整数[]
,这是不允许的,并且会因
ClassCastException
而失败

这在zip中也有描述:

关于方法签名的注意事项:由于Java不允许使用新的t[]创建泛型数组,因此该操作符的实现必须创建一个对象[]。不幸的是,传递给该方法的
函数将触发ClassCastException


当您将可观察表达式更改为
observable.zip(observable1,observable2,{o1,o2->listOf(o1,o2))
时会发生什么?我得到
无法推断拉链上此参数的类型
,我必须明确地将其设置为
双功能{o1,o2->listOf(o1,o2))}
在所有情况下,我都需要列表版本,因为我想压缩任意数量的可观察对象。当您将可观察表达式更改为
observatable.zip(observate1,observate2,{o1,o2->listOf(o1,o2))时会发生什么
?我得到
无法推断拉链上此参数的类型
,我必须明确地将其设置为
双功能{o1,o2->listOf(o1,o2))}
在所有情况下,我都需要列表版本,因为我想压缩任意数量的可观察对象。感谢您给出的非常清晰的答案!很抱歉遗漏了javadoc。感谢您给出的非常清晰的答案!很抱歉遗漏了javadoc。