Java zawsze będzie próbowała użyć najbardziej konkretnej odpowiedniej wersji dostępnej metody (patrz JLS §15.12.2 ).
Object
, char[]
I Integer
wszystko może wziąć null
jako ważnej wartości. Dlatego wszystkie 3 wersje mają zastosowanie, więc Java będzie musiała znaleźć najbardziej szczegółową.
Ponieważ Object
jest 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, Object
ale ż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 null
lub 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.
Integer
sięint
.