なぜscala varargメソッドは、Javaから使用すると、Seqの変数を受け付けるように見えるのですか?Javaのnative varargメソッドとして使用できません。これはバグですか?Javaでのscala varargメソッドの使用
たとえば、Buffer
は、方法def append(elems: A*): Unit
を持ちます。しかし、Javaではそれは別の署名:void append(Seq<A>)
を持っています。
なぜscala varargメソッドは、Javaから使用すると、Seqの変数を受け付けるように見えるのですか?Javaのnative varargメソッドとして使用できません。これはバグですか?Javaでのscala varargメソッドの使用
たとえば、Buffer
は、方法def append(elems: A*): Unit
を持ちます。しかし、Javaではそれは別の署名:void append(Seq<A>)
を持っています。
それはバグではありません。これは、Javaとの相互運用性を超えてScala内でのvarargの使用に賛成する設計上の選択です。たとえば、List
をScalaのvarargsメソッドに渡して、途中でArray
に変換せずに渡すことができます。
JavaからScala varargsを使用する必要がある場合は、代わりにscala Seqを作成する必要があります。たとえば、Javaラッパーを作成して配列を自動的に作成した後、Predef
オブジェクトのgenericWrapArray
メソッドを使用することができます。
は、:_*
を使用して簡単にキャストできます。例:
val b = collection.mutable.ListBuffer.empty[Int]
b.append(List(1, 2):_*)
これにより、コレクションAPIにコードの重複を避けることができます。
また、単にappendAll
を使用することができます。
b.appendAll((List(1, 2))
スカラコードを制御する場合、@varargsを使用して、Java互換のvaragsメソッドを生成することができます。 @varargs def append(elems: A*): Unit = {}
)うん、それはうまくいきますが、それは間違っています) – F0RR
Javaを使用するのは最初から間違っているからです) –
詳細については、http://stackoverflow.com/questions/10060377/how-to-useを参照してください。 -scala-varargs-from-java-code –