2012-04-08 9 views
19

ScalaコードからJava varargsを呼び出す方法はたくさんありますが、逆の方法で見つけることができる唯一のことは具体的な例がないUsing scala vararg methods in javaです。JavaコードからScala varargsを使用する方法

java.io.Consoleが、Eclipseでは動作しないのに対し、Scalaの場合は動作しないため、一部のJavaコードからscala.Consoleを使用しようとしています。それは第二引数にscala.collection.Seq[Any]を期待しているようだ、と私はJavaでSeqを作成する方法を見ていないので、しかし、私はこの方法

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

を動作させることはできません。これを回避するにはどうしたらいいですか?

物事は私が試してみた:使用

1)

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

ヌル - NullPointerExceptionで報われます。 scala.collection.Seq.empty()nullの交換、そのようなSeqなどのjavacレポートエラーのすべての種類は、empty方法を持たない

2)。

3)scala.collection.immutableパッケージオブジェクトにNilオブジェクトを使用しますが、構文がscala.collection.immutable.package$Nil$.MODULE$されるであろう、hereを提案し、それを解決することはできません。

もちろん、私はただvarargsを取らないreadLine()メソッドを使うことができますが、それは簡単すぎるでしょう。

答えて

24

あなたは使用することができます。

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

Javaコードから空のシーケンスを作成します。そうでなければ、使用することができます。

new scala.collection.mutable.ArrayBuffer(); 

をあなたがして要素を追加し、Scalaの可変引数メソッドの引数として使用することができますそこに空の配列のバッファを作成します。

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

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

私は答えを編集しました。 – axel22

+0

偉大な、それは動作します。両方ともEclipseでエラーを表示しますが、実際にはコンパイルされます。これは問題の一部であった可能性があります。 –

関連する問題