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à Integertất cả có thể mất nullnhư 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ì Objectlà 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à Integerphiên bản đều khả dụng, thì cả hai phiên bản đều cụ thể hơn Objectnhư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 nullhoặ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.
Integerthànhint.