19

ScalaコードからJavavarargsを呼び出すことに関する記事はたくさんありますが、逆の方法で見つけたのはこの質問だけでした。具体的な例がないjavaでscalavarargメソッドを使用することです。

Eclipseでは機能しないのに対し、Scalaでは機能scala.Consoleするという理由で、いくつかのJavaコードから使用しようとしています。java.io.Consoleしかし、私は方法を得ることができません

def readLine (text: String, args: Any*): String

2番目の引数にaを期待しているようで、Javaでscala.collection.Seq[Any]を作成する方法がわかりません 。Seqどうすればこれを回避できますか?

私が試したこと:

1)nullを使用する

// Java
String s = scala.Console.readLine("Enter text: ", null);

-で報酬を受け取りNullPointerExceptionます。

2)をに置き換えますnullが、javacは、メソッドがないscala.collection.Seq.empty()など、あらゆる種類のエラーを報告します。Seqempty

3)パッケージオブジェクトNil内のオブジェクトを使用しますが、ここで提案されている構文は、ですが、解決できません。scala.collection.immutablescala.collection.immutable.package$Nil$.MODULE$

もちろんreadLine()、varargsを使用しない方法を使用することもできますが、それは簡単すぎます。

4

1 に答える 1

25

次を使用できます。

scala.collection.Seq$.MODULE$.empty();

Javaコードから空のシーケンスを作成します。それ以外の場合は、次を使用できます。

new scala.collection.mutable.ArrayBuffer();

空の配列バッファーを作成し、そこに要素を追加して、Scalavarargメソッドの引数として使用できます。

それ以外の場合、Javaコードから使用するvarargメソッドを使用してScalaライブラリを設計する場合は、varargsアノテーションを使用します。の代わりに配列をとるメソッドのJavaバージョンを生成しますSeq

scala> class A {
     |   @annotation.varargs def foo(x: Int*) { println(x) }
     | }
defined class A

scala> println(classOf[A].getMethods.toList)
List(public void $line1.$read$$iw$$iw$A.foo(scala.collection.Seq), public void $line1.$read$$iw$$iw$A.foo(int[]), ...)

上記のリフレクションは、foo生成されたメソッドの2つのバージョンがあることを示しています。1つはaを取り、Seq[Int]もう1つは。を取りますint[]

于 2012-04-08T08:27:53.223 に答える