在Scala中,String...的等效写法是什么?

4
标题就问了这个问题。基本上我正在使用一个接受String...作为参数的Java库。我该如何在我的Scala代码中调用它呢?
我再补充一点:
从Scala代码中。
def myScalaFunc(params:String*) {
   val myJavaClass = new JavaClass()
   myJavaClass(params)
}
3个回答

6

您需要将params扩展为一系列参数,而不仅仅是一个集合参数。最简单的方法是使用params: _*

如果Java代码如下:

public class VarargTest {
  public void javaFunc(String... args) { 
    // something
  }
}

然后 Scala 的调用者看起来像这样:

def scalaFunc(params: String*) = 
  (new VarargTest).javaFunc(params: _*)

2
@chiappone 这个答案提供了解决您问题的方案,但是你应该理解 为什么 您的代码没有工作 - 因为,直觉上,你可能认为它 工作!看到,当你调用 scalaFunc,确保你传递进去的参数被解释为字符串的 varargs,但一旦你在 scalaFunc 内部,params 实际上被认为是 Seq[String]然而, 如果你需要把任何类型的 Seq 转换成 varargs,: _* 就是这个做到这一点的语法糖,这正是 dhg 在调用 javaFunc 时所使用的。 - Destin

5
如果方法已经被定义:
void method(String... param)

然后,您可以这样调用它:
method("String 1", "String 2")

使用特殊语法扩展 Seq:
method(Seq("String 1", "String 2"): _*)

假设您的示例代码如下(我假定我的编辑是正确的):

myJavaClass.myJavaMethod(params: _*)

1
在Java中,这是接收可变数量参数的方法的语法:
void method(String... param)

在Scala中,相应的语法是这样的:
def method (param:String*)

是的,但当我尝试执行myJavaMethod(param)时,签名似乎不匹配,其中param是一个字符串*。 - chiappone
@chiappone 您可以查看我上方的注释,如果 param 被定义为 String* ,则可以使用 Seq 扩展语法调用 myJavaMethod。 - Sean Parsons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接