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。