2012-03-21 28 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: _*)