请考虑以下代码:
private def test(some:String*){
}
private def call () {
val some = Array("asd", "zxc")
test(some)
}
打印expect String, found Array[String]
为什么? Scala varargs不是数组吗?
注意
我在Stack Overflow上发现了几个关于Scala varargs的问题,但所有这些问题都是关于调用Java varargs方法或将Scala列表转换为数组。
答案 0 :(得分:91)
答案 1 :(得分:35)
很简单:
def test(some:String*){}
def call () {
val some = Array("asd", "zxc")
test(some: _*)
}
答案 2 :(得分:0)
从 Scala 2.13.0 开始,如果您使用 some: _*
,您将收到此警告:
将显式数组值传递给 Scala varargs
方法是
已弃用(自 2.13.0
起)并将导致防御性副本;采用
更有效的非复制 ArraySeq.unsafeWrapArray
或显式
toIndexedSeq
调用
按照建议,使用 scala.collection.immutable.ArraySeq.unsafeWrapArray
:
unsafeWrapArray(some):_*
另外,你应该得到的另一个警告是这个
<块引用>不推荐使用过程语法:相反,将 : Unit =
添加到显式
声明 test
的返回类型
要解决这个问题,请在函数的左括号前添加 =
:
def test(some:String*) = {