Điều này 15.12.2.5 Choosing the Most Specific Method nói về điều này, nhưng nó khá phức tạp. ví dụ. Chọn giữa Foo (Số ... ints) và Foo (Số nguyên ... ints)
Vì lợi ích của tính tương thích ngược, đây là những điều tương tự.
public Foo(Object... args){} // syntactic sugar for Foo(Object[] args){}
// calls the varargs method.
Foo(new Object[]{new Object(), new Object()});
ví dụ: bạn có thể xác định main() như
public static void main(String... args) {
Một cách để làm cho họ khác nhau là để có một đối số trước khi varargs
public Foo(Object o, Object... os){}
public Foo(Object[] os) {}
Foo(new Object(), new Object()); // calls the first.
Foo(new Object[]{new Object(), new Object()}); // calls the second.
Họ không phải là giống hệt nhau. Sự khác biệt tinh tế là trong khi bạn có thể truyền một mảng tới một varargs, bạn không thể xử lý một tham số mảng như là một varargs.
public Foo(Object... os){}
public Bar(Object[] os) {}
Foo(new Object[]{new Object(), new Object()}); // compiles fine.
Bar(new Object(), new Object()); // Fails to compile.
Ngoài ra, biến thể phải là thông số cuối cùng.
public Foo(Object... os, int i){} // fails to compile.
public Bar(Object[] os, int i) {} // compiles ok.
Nguồn
2012-01-12 16:18:05
câu hỏi thú vị +1 – mKorbel
Tôi có thể thiếu điều gì đó, nhưng tại sao bạn cần quá tải? Nếu bạn khai báo phương thức của bạn là 'void foo (Object ... args)' thì bạn có thể gọi nó bằng ** hoặc ** 'foo (new Object(), new Object())' ** hoặc ** 'foo (đối tượng mới [] {new Object(), new Object()}) 'và nhận được kết quả tương tự. Xem [câu hỏi liên quan này] (http://stackoverflow.com/questions/1656901/varargs-and-the-argument) để biết ví dụ. –
vararg chỉ là một cờ để chữ ký phương thức chuyển đổi mảng được khai báo cuối cùng (như 'int []' hoặc 'Object []') thành kiểu vararg. Khác hơn thế - không có sự khác biệt giữa chữ ký của phương thức. Câu hỏi tương tự sẽ không thể quá tải phương thức 'private' và' public'. – bestsss