Java zawsze będzie próbowała użyć najbardziej konkretnej odpowiedniej wersji dostępnej metody (patrz JLS §15.12.2 ).
Object, char[]I Integerwszystko może wziąć nulljako ważnej wartości. Dlatego wszystkie 3 wersje mają zastosowanie, więc Java będzie musiała znaleźć najbardziej szczegółową.
Ponieważ Objectjest to nadtyp char[], wersja tablicowa jest bardziej szczegółowa niż Object-wersja. Jeśli więc istnieją tylko te dwie metody, char[]zostanie wybrana wersja.
Gdy dostępne są obie wersje char[]i Integer, obie są bardziej szczegółowe, Objectale żadna nie jest bardziej szczegółowa niż druga, więc Java nie może zdecydować, którą z nich wywołać. W takim przypadku musisz wyraźnie wspomnieć, który z nich chcesz wywołać, rzutując argument na odpowiedni typ.
Należy zauważyć, że w praktyce problem ten występuje znacznie rzadziej, niż mogłoby się wydawać. Powodem tego jest to, że dzieje się tak tylko wtedy, gdy jawnie wywołujesz metodę z nulllub ze zmienną raczej niespecyficznego typu (na przykład Object).
Wręcz przeciwnie, następujące wezwanie byłoby całkowicie jednoznaczne:
char[] x = null;
doSomething(x);
Chociaż nadal przekazujesz wartość null, Java dokładnie wie, którą metodę wywołać, ponieważ weźmie pod uwagę typ zmiennej.
Integersięint.