java から使用すると、すべての scala vararg メソッドが変数の Seq を受け入れるように見え、Java ネイティブの vararg メソッドとして使用できないのはなぜですか。これはバグですか?
たとえば、Buffer
has method def append(elems: A*): Unit
. しかし、Java では別の署名があります: void append(Seq<A>)
.
java から使用すると、すべての scala vararg メソッドが変数の Seq を受け入れるように見え、Java ネイティブの vararg メソッドとして使用できないのはなぜですか。これはバグですか?
たとえば、Buffer
has method def append(elems: A*): Unit
. しかし、Java では別の署名があります: void append(Seq<A>)
.
scala コードを制御する場合は、@varargs を使用して Java 互換の varags メソッドを生成できます。@varargs def append(elems: A*): Unit = {}
これはバグではありません。これは、Java との相互運用性よりも Scala 内での vararg の使用を優先する設計上の選択です。たとえば、途中で aList
に変換することなく、Scala varargs メソッドに aを渡すことができますArray
。
Java から Scala varargs を使用する必要がある場合は、代わりにいくつかの scala Seq を作成する必要があります。たとえば、Java ラッパーを作成して配列を自動的に作成し、オブジェクトのgenericWrapArray
メソッドを使用することができます。Predef
Seq
を使用してvarargsに簡単にキャストできます:_*
。例えば :
val b = collection.mutable.ListBuffer.empty[Int]
b.append(List(1, 2):_*)
したがって、これにより、コレクションAPIでのコードの重複が回避されます。
単に使用することもできますappendAll
:
b.appendAll((List(1, 2))