2012-03-21 53 views
4

标题问这个问题。基本上我正在使用一个Java库,它将一个String ...作为参数。我如何在我的Scala代码中调用它?请告诉我相当于字符串...斯卡拉

我将添加更多一点:从Scala代码

def myScalaFunc(params:String*) { 
    val myJavaClass = new JavaClass() 
    myJavaClass(params) 
} 
+0

是可变参数的问题? – 2012-03-21 19:07:23

回答

6

您必须将params扩展到一系列的参数,而不仅仅是一个单一的集合参数。最简单的方法是说params: _*

如果Java看起来像:

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

然后Scala的呼叫者的样子:

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

@chiappone这个答案提供了解决您的问题,但你应该明白_why_你的代码是行不通的,因为,直观地,人们可能会认为它_would_工作!看,当你调用'scalaFunc',当然,你传递的参数把它解释为字符串的可变参数,但是一旦你_inside of_'scalaFunc','params'实际上被认为是一个' SEQ [字符串]'。 _However_,如果你需要将任何类型的Seq'的'成可变参数,':_ *'是这样做的永远那么甜美语法糖,而这正是DHG是用人这里调用'javaFunc '。 – Destin 2012-03-21 19:48:13

1

在Java中,这是用于接收可变数量的参数的方法的语法:

void method(String... param) 

在斯卡拉,等效的语法是这样的:

def method (param:String*) 
+0

是啊,但签名似乎不匹配时,我尝试做myJavaMethod(PARAM),其中一个参数是一个字符串* – chiappone 2012-03-21 19:13:12

+0

@chiappone见我的评论上面,如果param被定义为字符串*然后使用序列扩展语法来调用myJava方法与它。 – 2012-03-21 19:16:09

5

如果方法定义:使用这个特殊的语法

method("String 1", "String 2") 

或扩展序列:

method(Seq("String 1", "String 2"): _*) 

鉴于

void method(String... param) 

然后呼叫它像这样你的示例代码(我假设我的编辑是正确的):

myJavaClass.myJavaMethod(params: _*)