2012-04-08 8 views
19

Istnieje wiele artykułów na temat wywoływania Java varargs z kodu Scala, ale jedyną rzeczą, którą mogłem znaleźć odwrotnie było to pytanie: Using scala vararg methods in java, które nie ma konkretnych przykładów.Jak używać Scala varargs z kodu Java

Próbuję użyć scala.Console z niektórych kodu Java, ponieważ java.io.Console nie działa w środowisku Eclipse, podczas gdy Scala ma. Ale nie mogę uzyskać metoda

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

do pracy, ponieważ wydaje się, że spodziewa się scala.collection.Seq[Any] dla drugiego argumentu, a ja nie wiem, jak stworzyć Seq w Javie. Jak mogę obejść ten problem?

Czego próbowałem:

1) Korzystanie zerowy

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

- nagrodzony z NullPointerException.

2) Wymiana null z scala.collection.Seq.empty(), ale raporty javac wszelkiego rodzaju błędy takie jak Seq nie posiadające metody empty.

3) Korzystanie z obiektu w opakowaniu obiektu scala.collection.immutableNil, ale składnia sugeruje here, co byłoby scala.collection.immutable.package$Nil$.MODULE$, ale które nie mogą być rozwiązane.

Oczywiście mogłem po prostu użyć metody readLine(), która nie bierze varargs, ale to byłoby zbyt łatwe.

Odpowiedz

24

Można użyć:

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

z kodu Java, aby utworzyć pusty ciąg. W przeciwnym razie, można użyć:

new scala.collection.mutable.ArrayBuffer(); 

aby utworzyć pusty bufor tablicy, do którego można dodać elementy i używać go jako argument do metody Scala vararg.

W przeciwnym razie, jeśli projektujesz bibliotekę Scala za pomocą metod vararg, których chcesz używać z kodu Java, użyj adnotacji varargs. Wygeneruje wersję Java metody, która pobiera tablicę zamiast 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[]), ...) 

Powyżej odbicie pokazuje, że istnieją 2 wersje metody foo generowane - taki, który bierze Seq[Int] a inny, który bierze int[].

+1

Edytowałem odpowiedź. – axel22

+0

Świetnie, że działa. Oba nadal pokazują błędy w Eclipse, ale faktycznie się kompilują. To mogło być częścią problemu. –