Tại sao nó (rõ ràng) tạo sự khác biệt cho dù tôi chuyển trực tiếp null
làm đối số hoặc chuyển Object
mà tôi đã gán giá trị null
?Phương thức Java gửi với đối số rỗng
Object testVal = null;
test.foo(testVal); // dispatched to foo(Object)
// test.foo(null); // compilation problem -> "The method foo(String) is ambiguous"
public void foo(String arg) { // More-specific
System.out.println("foo(String)");
}
public void foo(Object arg) { // Generic
System.out.println("foo(Object)");
}
Nói cách khác, tại sao lại là (nhận xét-out) gọi thứ hai để foo(...)
không cử đến foo(Object)
?
Cập nhật: Tôi sử dụng Java 1.6. Tôi có thể biên dịch mã của Hemal mà không có vấn đề gì, nhưng tôi vẫn không biên dịch. Sự khác biệt duy nhất tôi thấy là phương pháp của Hemal là tĩnh trong khi tôi thì không. Nhưng tôi thực sự không hiểu tại sao điều này lại tạo nên sự khác biệt ...?
Cập nhật 2: Đã giải quyết. Tôi đã có một phương thức khác (Runnable) trong lớp của tôi, do đó người điều phối không thể chọn một cách rõ ràng phương thức cụ thể nhất. (Xem bình luận của tôi trong câu trả lời thứ hai của Hemal.) Cảm ơn tất cả mọi người đã giúp đỡ của bạn.
Chỉ cần kiểm tra điều này và tôi choáng váng rằng (a) 6u11 không nói nó mơ hồ, và (b) null phân giải thành chuỗi không phải đối tượng. Tìm hiểu điều gì đó mới mỗi ngày - +1 cho bài học. –
@Software Monkey: Một khi bạn chấp nhận rằng null không đổi là kiểu null và kiểu null là một kiểu con của tất cả các kiểu, điều này khá rõ ràng. Đối tượng
Pedantry: phương thức ghi đè đối tượng bằng chuỗi. Quá tải là nơi tên phương thức giống nhau nhưng chữ ký thay đổi rộng rãi hơn. Câu trả lời tuyệt vời. Cám ơn. – Sam