2012-04-08 2 views
19

Es gibt viele Artikel über Java-Varargs aus Scala-Code aufrufen, aber das einzige, was ich den umgekehrten Weg finden konnte, war diese Frage: Using scala vararg methods in java, die keine konkreten Beispiele hat.Wie benutze Scala varargs von Java code

Ich versuche, scala.Console aus einigen Java-Code zu verwenden, aus dem Grund, dass java.io.Console nicht in Eclipse funktioniert, während die Scala man tut. Aber ich kann nicht die Methode

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

zu arbeiten, weil es scheint ein scala.collection.Seq[Any] für das zweite Argument zu erwarten, und ich sehe nicht, wie ein Seq in Java erstellen. Wie kann ich das umgehen?

Dinge, die ich habe versucht:

1) Unter Verwendung von null

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

- mit einem NullPointerException belohnt. Ersetzen

2) die null mit scala.collection.Seq.empty(), aber Javac Berichte alle möglichen Fehler wie Seq keine empty Verfahren mit.

3) Mit dem Nil Objekt im scala.collection.immutable Paketobjekt, aber die Syntax vorgeschlagen here, die scala.collection.immutable.package$Nil$.MODULE$ wäre, aber das kann nicht aufgelöst werden.

Natürlich könnte ich einfach die readLine() Methode verwenden, die Varargs nicht übernimmt, aber das wäre zu einfach.

Antwort

24

können Sie verwenden:

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

von Java-Code eine leere Sequenz zu erstellen. Sie können verwendet werden:

new scala.collection.mutable.ArrayBuffer(); 

einen leeren Array-Puffer zu schaffen, in die man dann Elemente hinzufügen und es als Argument an Scala Vararg Methoden.

Wenn Sie eine Scala-Bibliothek mit Vararg-Methoden entwerfen, die Sie aus Java-Code verwenden möchten, verwenden Sie andernfalls die varargs Annotation. Es wird eine Java-Version der Methode generieren, die ein Array anstelle eines Seq übernimmt.

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[]), ...) 

Above, Reflexion zeigt, dass es 2 Versionen der Methode foo erzeugt - eine, die eine Seq[Int] und ein anderer führt die eine int[] nimmt.

+1

Ich habe die Antwort bearbeitet. – axel22

+0

Großartig, das funktioniert. Beide zeigen immer noch Fehler in Eclipse, aber sie kompilieren tatsächlich. Dies könnte Teil des Problems gewesen sein. –