Tôi nhận thấy hôm nay rằng tự động đấm bốc đôi khi có thể gây ra sự mơ hồ trong phương pháp phân giải quá tải. Ví dụ đơn giản nhất dường như là điều này:Tại sao autoboxing thực hiện một số cuộc gọi mơ hồ trong Java?
public class Test {
static void f(Object a, boolean b) {}
static void f(Object a, Object b) {}
static void m(int a, boolean b) { f(a,b); }
}
Khi biên soạn, nó gây ra các lỗi sau:
Test.java:5: reference to f is ambiguous, both method
f(java.lang.Object,boolean) in Test and method
f(java.lang.Object,java.lang.Object) in Test match
static void m(int a, boolean b) { f(a, b); }
^
Việc sửa chữa lỗi này là tầm thường: chỉ cần sử dụng rõ ràng auto-boxing:
static void m(int a, boolean b) { f((Object)a, b); }
Gọi chính xác quá tải đầu tiên như mong đợi.
Vậy tại sao độ phân giải quá tải thất bại? Tại sao trình biên dịch không tự động chọn đối số đầu tiên, và chấp nhận đối số thứ hai bình thường? Tại sao tôi phải yêu cầu auto-boxing một cách rõ ràng?
Cảm ơn bạn @eljenso. Điều này làm rõ vấn đề của trình biên dịch, nhưng sau đó nó làm cho tôi tự hỏi tại sao giai đoạn thứ hai được định nghĩa là như vậy. Nó có thể được sửa đổi bằng cách "làm ít nhất có thể số lượng chuyển đổi quyền anh/unboxing" không? –
Câu trả lời hay! –
Vâng, cảm ơn bạn @eljenso! Tôi đồng ý rằng, trong ví dụ của bạn, cuộc gọi không rõ ràng. Tôi sẽ nghĩ rằng hai tình trạng quá tải sẽ có cùng số lượng chuyển đổi quyền anh, vì vậy cuộc gọi thực sự là mơ hồ. Nhưng (bất kể JLS), tôi không thấy ví dụ của tôi mơ hồ. Bạn nghĩ sao? –