I have an Android app written 100% in Kotlin.
In my unit test class I have 2 test observers, one observing integers, another - objects:
val conversationCountObserver: TestObserver<Int>
val conversationObserver: TestObserver<Conversation>
For each one I want to do some basic assertions, like check that there were no errors and check the values observed. I decide to write a generic method that can do a number of assertions on a list of elements in an RX TestObserver class, and 2 proxy methods to pass corresponding observer and vararg of values via Kotlin * spread operator:
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)
}
}
thenConversationsNotified() method works just fine, however the thenConversationCountNotified() shows an error:
在阅读Kotlin docs(http://kotlinlang.org/docs/reference/java-interop.html#java-arrays)之后,我意识到原语类型的vararg实际上创建了一个IntArray对象,而不是一个数组,这是作为Java互操作的一个解决方案完成的,它以不同于对象的方式对待原语的vararg.所以我必须重写与你的对话.toTypedArray():
private fun thenConversationCountNotified(vararg counts: Int) {
thenTestObserverNotified(conversationCountObserver, *counts.toTypedArray())
}
为什么spread运算符对基本数组类的处理方式与对对象数组的处理方式不同?有没有办法取消对的呼叫.这里是toTypedArray()吗?
附注:请注意,在上面的链接中,它们声明intArrayOf(1,2,3)返回IntArray,并且在将其传递给另一个方法时,扩散运算符工作正常.所以扩散运算符确实适用于IntArray类.Kotlin文档中的示例和我的方法之间唯一的区别是,我在一个方法中有两个参数,一个是具体的,一个是vararg.