Java sẽ luôn cố gắng sử dụng phiên bản áp dụng cụ thể nhất của phương thức có sẵn (xem JLS §15.12.2 ).
Object
, char[]
Và Integer
tất cả có thể mất null
như một giá trị hợp lệ. Do đó, cả 3 phiên bản đều có thể áp dụng được, vì vậy Java sẽ phải tìm một phiên bản cụ thể nhất.
Vì Object
là siêu kiểu char[]
, phiên bản mảng cụ thể hơn so với đảo ngược Object
. Vì vậy, nếu chỉ có hai phương thức đó tồn tại, char[]
phiên bản sẽ được chọn.
Khi cả hai phiên bản char[]
và Integer
phiên bản đều khả dụng, thì cả hai phiên bản đều cụ thể hơn Object
nhưng không phiên bản nào cụ thể hơn phiên bản kia, vì vậy Java không thể quyết định nên gọi cái nào. Trong trường hợp này, bạn sẽ phải đề cập rõ ràng đến cái nào bạn muốn gọi bằng cách chuyển đối số thành loại thích hợp.
Lưu ý rằng trong thực tế, vấn đề này hiếm khi xảy ra hơn nhiều so với người ta tưởng. Lý do cho điều này là nó chỉ xảy ra khi bạn gọi một phương thức rõ ràng bằng null
hoặc với một biến có kiểu khá không cụ thể (chẳng hạn như Object
).
Ngược lại, lời mời sau đây sẽ hoàn toàn không rõ ràng:
char[] x = null;
doSomething(x);
Mặc dù bạn vẫn truyền giá trị null
, Java biết chính xác nên gọi phương thức nào, vì nó sẽ đưa loại biến vào tài khoản.
Integer
thànhint
.