2011-11-29 10 views
9

なぜscala varargメソッドは、Javaから使用すると、Seqの変数を受け付けるように見えるのですか?Javaのnative varargメソッドとして使用できません。これはバグですか?Javaでのscala varargメソッドの使用

たとえば、Bufferは、方法def append(elems: A*): Unitを持ちます。しかし、Javaではそれは別の署名:void append(Seq<A>)を持っています。

答えて

7

それはバグではありません。これは、Javaとの相互運用性を超えてScala内でのvarargの使用に賛成する設計上の選択です。たとえば、ListをScalaのvarargsメソッドに渡して、途中でArrayに変換せずに渡すことができます。

JavaからScala varargsを使用する必要がある場合は、代わりにscala Seqを作成する必要があります。たとえば、Javaラッパーを作成して配列を自動的に作成した後、PredefオブジェクトのgenericWrapArrayメソッドを使用することができます。

+0

)うん、それはうまくいきますが、それは間違っています) – F0RR

+1

Javaを使用するのは最初から間違っているからです) –

+0

詳細については、http://stackoverflow.com/questions/10060377/how-to-useを参照してください。 -scala-varargs-from-java-code –

-5

は、:_*を使用して簡単にキャストできます。例:

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のvarargsにキャストできないということではありません。問題は、varargsでメソッドを使用するためにJavaでSeqを作成する必要があることです。 – F0RR

14

スカラコードを制御する場合、@varargsを使用して、Java互換のvaragsメソッドを生成することができます。 @varargs def append(elems: A*): Unit = {}

関連する問題