2011-11-29 54 views
9

爲什麼所有使用java的scala可變參數方法似乎都接受變量的Seq,並且不能用作java本地可變參數方法。這是一個錯誤?例如,Buffer具有方法def append(elems: A*): Unit。但在Java中它有另一個簽名:void append(Seq<A>)在java中使用scala可變參數的方法

回答

7

這是不是一個錯誤。這是一個設計選擇,有利於在Scala中與Java的互操作性中使用可變參數。例如,它允許您將List轉換爲Scala可變參數方法,而無需在途中將其轉換爲Array

如果您需要使用Java的Scala可變參數,您應該創建一些scala Seq。例如,您可以編寫一個Java包裝來獲取自動創建的數組,然後使用Predef對象中的genericWrapArray方法。

+0

那麼,是的,這是有效的,但是是錯誤的)) – F0RR

+1

這是因爲使用Java是錯誤的第一位;) –

+0

欲瞭解更多詳細信息,請參閱http://stackoverflow.com/questions/10060377/how-to-use -scala-可變參數從 - Java的代碼 –

-5

使用:_*您可以很容易地輸入Seq的可變參數值。例如:

val b = collection.mutable.ListBuffer.empty[Int] 
b.append(List(1, 2):_*) 

所以收集API在這避免代碼重複。

你也可以簡單地使用appendAll

b.appendAll((List(1, 2)) 
+0

嗯,是的,我可以,但這怎麼回答我的問題?)) – F0RR

+0

我剛剛修改了我的答案。 – David

+0

問題不在於Seq無法在scala中轉換爲可變參數。問題是我必須在Java中創建一個Seq來使用可變參數的方法。 – F0RR

14

如果您控制scala代碼,您可以使用@varargs使它生成一個java兼容的varags方法,例如, @varargs def append(elems: A*): Unit = {}

相關問題