当前位置: 首页 > 知识库问答 >
问题:

为什么Kotlin spread运算符在传递原始vararg参数时需要toTypedArray()?

西门山
2023-03-14

我有一个Android应用程序写100%在科特林。

在我的单元测试类中,我有两个测试观察器,一个观察整数,另一个观察对象:

val conversationCountObserver: TestObserver<Int>
val conversationObserver: TestObserver<Conversation>

对于每一个,我都想做一些基本的断言,比如检查没有错误,检查观察到的值。我决定编写一个泛型方法,它可以对RX TestObserver类中的一系列元素执行大量断言,并编写两个代理方法,通过Kotlin*spread运算符传递相应的observer和vararg值:

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)
    }
}

private fun thenConversationCountNotified(vararg counts: Int) {
    thenTestObserverNotified(conversationCountObserver, *counts.toTypedArray())
}

附言。请注意,在上面的链接中,它们声明了返回IntArray的intArrayOf(1,2,3),当将其传递给另一个方法时,spread运算符工作正常。所以spread运算符确实可以使用IntArray类。Kotlin文档中的一个例子和我的方法之间唯一的区别是,我在一个方法中有两个参数,一个是混凝土参数,一个是Vararg参数

共有1个答案

衡丰茂
2023-03-14

int类型用作类型参数时(在您的示例中替换t),不能使用JVM原语,这是一个JVM限制(它有一个带有java.lang.object的方法签名来代替类型参数,因此不能接受原语)。

vararg使情况变得复杂,但是,实际上,接受vararg元素的函数:t与接受数组 相同。

因此,您需要传递array (装箱整数数组)而不是intarray(原语数组),而.totypedarray()函数是获取前者的方法。

 类似资料:
  • 我正在阅读有关java中的同步概念的信息,并遇到了同步语句。 我想知道,为什么我们向它传递参数,尽管它看起来像静态块(这只是一个例子),并且传递的参数没有指定任何数据类型。 例: 如果有人知道,请解释。

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 改善这个问题 Java为什么不需要运算符重载?Java有什么方法可以支持它吗? 问题答案: Java仅允许对基本数字类型进行算术运算。这是喜忧参半的事情,因为尽管在其他类型(如复数,向量等)上定义运算符很方便,但始终存在与实现相关的特性。因此,运营

  • 问题内容: jslint工具的提示之一是: ++和- 已知++(递增)和-(递减)运算符会通过鼓励过多的技巧而导致不良代码。在支持病毒和其他安全威胁方面,它们仅次于错误的体系结构。有一个plusplus选项禁止使用这些运算符。 我知道像这样的PHP构造可能很容易导致一次错误的错误,但是我找不到比a 或更好的控制循环的方法。 jslint是否突出显示它们,是因为有些相似的语言缺少“”和“”语法或以不

  • 我读了一些关于如何使用log4j的文章。他们中的大多数给出以下代码作为开始: 或 这将初始化记录器对象。但是我的问题是为什么需要发送类类型作为参数?似乎当我使用记录器时,我不在乎在哪个类中使用它。所以类类型似乎对记录器没有影响。如果我声明一个记录器为静态和公共的,我可以在另一个类中调用这个记录器,那么作者这样设计它的意图是什么?当我使用记录器时,类类型会绑定一些东西吗?或者我可以发送任何类类型到g

  • 问题内容: print语句导致以下编译时错误, 局部变量f可能尚未初始化 如果Java中的原语已经具有默认值(float = 0.0f) ,为什么需要定义一个? 所以这有效 感谢大家! 问题答案: 因为它是一个局部变量。这就是为什么什么都没有分配的原因: 局部变量略有不同。编译器永远不会为未初始化的局部变量分配默认值。如果您无法在声明它的地方初始化本地变量,请确保在尝试使用它之前为其分配一个值。访

  • print语句会导致以下编译时错误, 局部变量f可能尚未初始化 如果Java中的原语已经有一个默认值(float=0.0f),为什么我需要定义一个呢? 所以,这是有效的 谢谢大家!