Ant*_*hyn 6 generics kotlin rx-java
我有一个100%用Kotlin编写的Android应用。
在我的单元测试课程中,我有2个测试观察者,一个观察整数,另一个观察对象:
val conversationCountObserver: TestObserver<Int>
val conversationObserver: TestObserver<Conversation>
Run Code Online (Sandbox Code Playgroud)
对于每一个我想做一些基本的断言,例如检查是否没有错误并检查观察到的值。我决定编写一个通用方法,该方法可以对RX TestObserver类中的元素列表执行许多断言,并编写2个代理方法,以通过Kotlin * spread运算符传递值的相应观察者和变量:
private fun thenConversationsNotified(vararg conversations: Conversation) {
thenTestObserverNotified(conversationObserver, *conversations)
}
private fun thenConversationCountNotified(vararg counts: Int) {
thenTestObserverNotified(conversationCountObserver, *counts)
}
private fun <T>thenTestObserverNotified(observer: TestObserver<T>, vararg elements: T) {
observer.assertNoErrors()
elements.forEachIndexed { index, element ->
observer.assertValueAt(index, element)
}
}
Run Code Online (Sandbox Code Playgroud)
thenConversationsNotified()方法工作正常,但是thenConversationCountNotified()显示错误:
在阅读Kotlin文档(http://kotlinlang.org/docs/reference/java-interop.html#java-arrays)之后,我意识到原始类型的vararg实际上创建了一个IntArray对象而不是一个Array,这是作为一个Java互操作的解决方案,该方法对待原语的变量与对象的对待不同。所以我必须用.toTypedArray()重写thenConversationCountNotified:
private fun thenConversationCountNotified(vararg counts: Int) {
thenTestObserverNotified(conversationCountObserver, *counts.toTypedArray())
}
Run Code Online (Sandbox Code Playgroud)
为什么散布运算符不能以与对象数组相同的方式在原始数组类上工作?有什么办法可以删除对.toTypedArray()的调用?
PS注意,在上面的链接中,它们声明了返回IntArray的intArrayOf(1,2,3),并且在将其传递给其他方法时,散布运算符可以正常工作。因此,传播算子确实适用于IntArray类。Kotlin文档中的示例与我的方法之间的唯一区别是,我在一个方法中有2个参数,一个是具体参数,另一个是vararg。
当Int类型用作类型参数(T在您的情况下替换)时,不能使用 JVM 原语,这是 JVM 限制(它有一个方法签名java.lang.Object代替类型参数,因此它不能接受原语)。
这vararg使情况复杂化,但是,在幕后,接受的函数vararg elements: T与接受Array<T>.
所以你需要传递Array<Int>(装箱整数数组)而不是IntArray(基元数组),.toTypedArray()函数是获取前者的方法。