2012-04-08 14 views
19

Scala kodundan Java varargs'ı çağıran birçok makale var, ancak tam tersi yolu bulabildiğim tek şey şu soru: Using scala vararg methods in java, herhangi bir somut örnek içermiyor.Java kodundan Scala varargs nasıl kullanılır

Bazı Java kodlarından scala.Console kullanmayı denedim, çünkü java.io.Console, Eclipse'de çalışmıyor, çünkü Scala one yok. Ama yöntemini ikinci argüman için scala.collection.Seq[Any] bekliyor gibi görünüyor, çünkü

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

çalışmak ve Java bir Seq nasıl oluşturulacağını görmüyorum alınamıyor. Bu konuda nasıl çalışabilirim?

şeyler denedim: Kullanılması

1)

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

boş - bir NullPointerException ile ödüllendirilir olsun. scala.collection.Seq.empty() ile null değiştirilmesi, ancak bu tür Seq olarak Javac raporları hataları her türlü bir empty yöntem olmamasından

2).

scala.collection.immutable paket nesnesinde Nil nesneyi kullanarak 3), ancak sözdizimi scala.collection.immutable.package$Nil$.MODULE$ olacağını here önerdi, ama bu çözülemeyen.

Elbette sadece varargs almayan readLine() yöntemini kullanabilirdim, ancak bu çok kolay olurdu.

cevap

24

Sen kullanabilirsiniz:

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

Java kodu boş bir diziyi oluşturmak için. Aksi takdirde, kullanabilir:

new scala.collection.mutable.ArrayBuffer(); 

sonra elemanları eklemek ve Scala vararg yöntemlere bağımsız değişken olarak kullanabilir içine boş bir dizi tampon oluşturmak için kullanılır.

Aksi takdirde, Java kodunda kullanmak istediğiniz vararg yöntemleri içeren bir Scala kütüphanesi tasarlarsanız, varargs ek açıklamalarını kullanın. Seq yerine bir dizi alan yöntemin bir Java sürümünü oluşturur. Bir Seq[Int] alır on ve bir int[] alır başka - yukarıda

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

, yansıtma oluşturulan yöntem foo 2 sürümleri olduğunu göstermektedir.

+1

Cevabı düzenledim. – axel22

+0

Harika, bu işe yarıyor. Her ikisi de Eclipse'de hatalar gösteriyor, ama aslında derlerler. Bu sorunun bir parçası olabilir. –