Scala变长参数(varargs)调用疑问:为何混合传参不被允许?
Scala可变参数调用问题解析
你定义的func方法确实支持接收任意数量的String类型参数,前两种调用方式完全合法,但第三种写法会报错,核心原因和解决办法如下:
为什么第三种调用不合法?
Scala里的可变参数(String*)会将传入的参数自动打包为Seq[String],而_*是专门用来展开序列为可变参数列表的符号,但它有个硬性规则:只能放在参数列表的最后一个位置,不能和其他普通参数混合使用。
当你尝试func("foo", strArr: _*)时,strArr: _*不是最后一个参数位置,编译器无法解析这种混合写法,因此直接报错。
可行的替代方案
如果需要同时传入单个字符串和数组中的元素,只需先将单个元素与数组合并成一个新序列,再用_*展开即可:
val strArr = Array("hello", "world") // 用+:在数组头部添加元素,再展开 func(("foo" +: strArr): _*) // 或者用Seq合并后展开 func(Seq("foo") ++ strArr: _*)
也可以直接合并数组后传递:
val strArr = Array("hello", "world") func((Array("foo") ++ strArr): _*)
内容的提问来源于stack exchange,提问作者Juan Cruz Carrau
相关产品推荐
相关产品推荐

