2009-07-04 27 views
8

Tôi có một phương pháp mà trông như thế này trên Java:JSR223: Gọi Java "varargs" phương pháp từ kịch bản

public void myMethod(Object... parms); 

Nhưng tôi không thể gọi phương pháp này như mong đợi từ các kịch bản.

Nếu trong ruby, tôi làm:

$myObject.myMethod(42); 

Nó mang lại cho tôi org.jruby.exceptions.RaiseException: could not coerce Fixnum to class [Ljava.lang.Object

Nếu tôi thử như sau trong Javascript:

myObject.myMethod(42); 

Sau đó, nó mang lại cho tôi sun.org.mozilla.javascript.internal.EvaluatorException: Can't find method MyClass.test(number). (#2) in at line number 2

Tất nhiên, nếu tôi thay đổi chữ ký để có một bài hát le đối tượng sau đó nó hoạt động.

Tôi giả định rằng điều này là do ai đó dọc theo dòng không biết cách chuyển đổi, giả sử Integer thành Integer[] với giá trị ở vị trí đầu tiên.

Tôi tin rằng một cái gì đó như myMethod({42, 2009}) sẽ hoạt động trong Ruby, nhưng điều này có vẻ xấu xí - Tôi muốn có thể chỉ làm myMethod(42, 2009) để làm cho nó ít khó hiểu, đặc biệt cho các ngôn ngữ khác. Có cách giải quyết nào tốt hơn cho việc này không?

Cảm ơn.

Trả lời

0

Các biến được xử lý bởi trình biên dịch dưới dạng đối tượng [], đó là thông báo lỗi mô tả.

Tôi không có kinh nghiệm JRuby, nhưng nó có hoạt động nếu bạn có đối số mảng không?

2

Java xử lý nội bộ danh sách đối số có độ dài biến là một mảng có các phần tử cùng loại. Đó là lý do tại sao bạn cần cung cấp một mảng các đối tượng trong kịch bản JRuby của bạn.

Nó hoạt động như thế này:

myMethod [42, 2009].to_java 

Phương pháp to_java xây dựng một mảng Java từ một mảng Ruby. Theo mặc định, to_java tạo các mảng Đối tượng khi cần trong trường hợp này. Nếu bạn cần một mảng chuỗi bạn sẽ sử dụng

["a","b","c"].to_java(:string) 

Thông tin thêm về này tại JRuby wiki

+0

một ví dụ khác: JRuby -rjava -e 'fmt = java.util.Formatter.new(); đặt fmt.format ("|% 4s |", ["üü"]. to_java) ' – reto

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