2011-01-15 30 views
10

Giả sử một phương pháp với chữ ký sau đây:Làm thế nào để vượt qua một ArrayList đến một phương thức mong đợi một vararg (Object ...)?

public static void foo(String arg1, String args2, Object... moreArgs); 

Khi chạy ...

ClassName.foo("something", "something", "first", "second", "third"); 

... Tôi sẽ nhận được moreArgs[0] == "first", moreArgs[1] == "second"moreArgs[2] == "third".

Nhưng giả sử rằng tôi có các thông số được lưu trữ trong một ArrayList<String> được gọi là arrayList có chứa "đầu tiên", "thứ hai" và "thứ ba".

Tôi muốn gọi foo để moreArgs[0] == "first", moreArgs[1] == "second"moreArgs[2] == "third" sử dụng thông số arrayList làm thông số.

nỗ lực ngây thơ của tôi là ...

ClassName.foo("something", "something", arrayList); 

... nhưng điều đó sẽ cho tôi moreArgs[0] == arrayList mà không phải là những gì tôi muốn.

Cách chính xác để vượt qua arrayList đến phương pháp foo ở trên để moreArgs[0] == "first", moreArgs[1] == "second"moreArgs[2] == "third"?

Xin lưu ý rằng số đối số trong arrayList xảy ra là ba trong trường hợp cụ thể này, nhưng giải pháp mà tôi đang tìm kiếm rõ ràng là chung và làm việc cho bất kỳ số đối số nào trong arrayList.

Trả lời

22

Chuyển đổi ArrayList của bạn thành một mảng đối tượng kiểu.

ClassName.foo("something", "something", arrayList.toArray());
+0

Ồ, thật đơn giản! Tôi nghĩ Object ...! = Object []. Cảm ơn! :-) – knorv

+0

Đối tượng chung! = Đối tượng [], nhưng đối với phương thức varargs, trình biên dịch chuyển đổi tham số MyType ... thành tham số MyType [] và kết thúc tất cả đối số vào một mảng tại thời gian chạy được chuyển đến hàm. Vì vậy, trong trường hợp này, bạn có thể tận dụng lợi thế của chữ ký nội bộ bí mật của phương thức varargs bằng cách chuyển một cách rõ ràng trong một tham chiếu mảng. –

-1

Bạn vượt qua nó như cách bạn mong đợi. Tuy nhiên chỉ có một điều, và nó là tham chiếu đến ArrayList.

Sau đó, bạn phải chuyển nội dung của mình khỏi danh sách mảng.

+0

Tôi chỉ có thể kiểm soát mã gọi phương thức foo, vì vậy việc thay đổi phương thức foo không phải là một tùy chọn. – knorv

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