2012-04-08 33 views
19

Có rất nhiều bài viết về cách gọi Java varargs từ mã Scala, nhưng điều duy nhất tôi có thể tìm thấy vòng đối diện là câu hỏi này: Using scala vararg methods in java, mà không có bất kỳ ví dụ cụ thể nào.Làm thế nào để sử dụng Scala varargs từ mã Java

Tôi đang cố gắng sử dụng scala.Console từ một số mã Java, vì lý do mà java.io.Console không hoạt động trong Eclipse, trong khi đó Scala thực hiện. Nhưng tôi không thể có được phương pháp

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

để làm việc bởi vì nó dường như được mong đợi một scala.collection.Seq[Any] cho đối số thứ hai, và tôi không thấy làm thế nào để tạo ra một Seq trong Java. Làm thế nào tôi có thể làm việc xung quanh điều này?

Những điều tôi đã cố gắng:

1) Sử dụng rỗng

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

- được thưởng bằng một NullPointerException.

2) Thay thế null với scala.collection.Seq.empty(), nhưng báo cáo javac tất cả các loại lỗi như Seq không có một phương pháp empty.

3) Sử dụng đối tượng Nil trong đối tượng gói scala.collection.immutable, nhưng cú pháp được đề xuất here, sẽ là scala.collection.immutable.package$Nil$.MODULE$ nhưng không thể giải quyết được.

Tất nhiên tôi chỉ có thể sử dụng phương pháp readLine() không sử dụng varargs, nhưng điều đó sẽ quá dễ dàng.

Trả lời

24

Bạn có thể sử dụng:

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

từ mã Java để tạo ra một chuỗi rỗng. Nếu không, bạn có thể sử dụng:

new scala.collection.mutable.ArrayBuffer(); 

để tạo bộ đệm mảng trống mà sau đó bạn có thể thêm phần tử và sử dụng nó làm đối số cho phương pháp vara vararg.

Nếu không, nếu bạn thiết kế một thư viện Scala với các phương pháp vararg mà bạn muốn sử dụng từ mã Java, thì hãy sử dụng chú thích varargs. Nó sẽ tạo ra một phiên bản Java của phương thức có một mảng thay vì một 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[]), ...) 

Ở trên, phản ánh cho thấy có 2 phiên bản của phương pháp foo tạo - một trong đó có một Seq[Int] và khác mà phải mất một int[].

+1

Tôi đã chỉnh sửa câu trả lời. – axel22

+0

Tuyệt vời, hoạt động. Cả hai vẫn hiển thị lỗi trong Eclipse, nhưng chúng thực sự biên dịch. Điều này có thể là một phần của vấn đề. –

Các vấn đề liên quan