2014-12-04 21 views
14

Tôi có một số chức năng hệ thống varargs, trong đó T là một số loại thực tế, giống như String:Làm thế nào để gọi một phương thức varargs với một cuộc tranh cãi bổ sung từ một phương pháp varargs

sys(T... args) 

Tôi muốn tạo chức năng riêng, mà các đại biểu với chức năng hệ thống. Chức năng của tôi là cũng một chức năng varargs. Tôi muốn đi qua tất cả các đối số cho chức năng của tôi thông qua chức năng hệ thống, cộng với một đối số kéo dài bổ sung. Một cái gì đó như thế này:

myfunc(T... args) { 
    T myobj = new T(); 
    sys(args, myobj); // <- of course, here error. 
} 

Làm cách nào để thay đổi dòng có lỗi? Bây giờ tôi chỉ thấy một cách: tạo mảng với tham số [args] + 1 và sao chép tất cả các mục vào mảng mới. Nhưng có thể có một cách đơn giản hơn?

+1

@aioobe, thực tế loại đối tượng, nếu không, nếu tôi đúng, tôi không thể tạo ra myobj. Một số thay đổi tin nhắn đầu tiên –

+0

Đó là lý do tại sao tôi đã yêu cầu ;-) – aioobe

Trả lời

7

Bây giờ tôi chỉ thấy một cách: tạo mảng với tham số [args] + 1 và sao chép tất cả các mục vào mảng mới.

Không có cách nào đơn giản hơn. Bạn cần tạo một mảng mới và bao gồm myobj làm phần tử cuối cùng của mảng.

String[] args2 = Arrays.copyOf(args, args.length + 1); 
args2[args2.length-1] = myobj; 
sys(args2); 

Nếu bạn tình cờ phụ thuộc vào Apache Commons Lang bạn có thể làm

sys(ArrayUtils.add(args, myobj)); 

hoặc ổi

sys(ObjectArrays.concat(args, myobj)); 
6

Bạn có thể gọi sys() hai lần nếu lệnh không quan tâm:

T myobj=new T(); 
sys(myobj); 
sys(args); 

Nếu bạn không thể sử dụng, chuyển sang bộ sưu tập (ví dụ: LinkedList) cho tất cả các chức năng của bạn.

+1

Tôi không thể thực hiện cuộc gọi này, bởi vì sys lại một số đối tượng khác như là kết quả, phụ thuộc vào tham số đầu vào. Ví dụ: string.format(). –

+0

Sau đó, bạn phải sao chép mảng hoặc sử dụng các bộ sưu tập cho tất cả các chức năng đó. Sau đó, bạn có thể thêm mục mới của mình. – brummfondel

+0

@brummfondel, bạn có gợi ý rằng anh ta nên sửa đổi bộ sưu tập đối số? Đó không phải là rất lịch sự với người gọi (và chỉ hoạt động nếu đối số là một bộ sưu tập có thể thay đổi). – aioobe

2

Nếu bạn có thể sử dụng Guava, sau đó bạn có thể làm:

sys(ObjectArrays.concat(myobj, args)) 
1

Java 8 giải pháp:

sys(Stream.concat(Arrays.stream(args), Stream.of(myobj)).toArray(T[]::new)); 
Các vấn đề liên quan