2011-11-29 31 views
9

Tại sao tất cả các phương thức varala vararg, khi được sử dụng từ java, dường như chấp nhận một Seq của các biến, và không thể được sử dụng như các phương thức vararg gốc của java. Đây có phải là một lỗi?Sử dụng các phương pháp varala vararg trong java

Ví dụ: Buffer có phương thức def append(elems: A*): Unit. Nhưng trong java nó có chữ ký khác: void append(Seq<A>).

Trả lời

7

Nó không phải là một lỗi. Nó là một sự lựa chọn thiết kế có lợi cho việc sử dụng vararg trong phạm vi Scala qua khả năng tương tác với Java. Ví dụ, nó cho phép bạn vượt qua một List vào một phương pháp varala varargs mà không cần phải chuyển đổi nó sang một số Array trên đường.

Nếu bạn cần sử dụng Scala varargs từ Java, bạn nên tạo một số Scala Seq thay thế. Ví dụ, bạn có thể viết một trình bao bọc Java để tạo một mảng được tạo tự động và sau đó sử dụng phương thức genericWrapArray từ đối tượng Predef.

+0

Vâng, vâng, hoạt động, nhưng rất sai)) – F0RR

+1

Đó là vì sử dụng Java là sai ở nơi đầu tiên;) –

+0

Để biết thêm chi tiết, hãy xem http://stackoverflow.com/questions/10060377/how-to-use -scala-varargs-from-java-code –

-5

bạn có thể dễ dàng tạo một Seq trong các vararg bằng cách sử dụng :_*. Ví dụ:

val b = collection.mutable.ListBuffer.empty[Int] 
b.append(List(1, 2):_*) 

để tránh trùng lặp mã trong API thu thập.

Bạn cũng có thể chỉ cần sử dụng appendAll:

b.appendAll((List(1, 2)) 
+0

Vâng, vâng, tôi có thể, nhưng cách trả lời câu hỏi của tôi?)) – F0RR

+0

Tôi vừa sửa đổi câu trả lời của mình. – David

+0

Vấn đề không phải là Seq không thể được đúc thành varargs trong scala. Vấn đề là tôi phải tạo một Seq trong Java để sử dụng một phương thức với varargs. – F0RR

14

Nếu bạn kiểm soát mã scala, bạn có thể sử dụng @varargs để làm cho nó tạo ra phương pháp varags tương thích với java, ví dụ: @varargs def append(elems: A*): Unit = {}

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