Java всегда будет пытаться использовать наиболее конкретную применимую версию метода, которая доступна (см. JLS §15.12.2 ).
Object
, char[]
и Integer
могут принимать null
в качестве допустимого значения. Поэтому применимы все 3 версии, поэтому Java придется искать наиболее конкретную.
Поскольку Object
является супертипом char[]
, версия массива более специфична, чем Object
-версия. Поэтому, если существуют только эти два метода, будет выбрана версия char[]
.
Когда доступны обе версии char[]
и Integer
, тогда обе обе являются более конкретными, чем Object
, но ни одна не является более конкретной, чем другая, поэтому Java не может решить, какая один позвонить. В этом случае вам придется явно указать, какой из них вы хотите вызвать, приведя аргумент к соответствующему типу.
Обратите внимание, что на практике эта проблема встречается гораздо реже, чем можно подумать. Причина этого в том, что это происходит только тогда, когда вы явно вызываете метод с null
или с переменной довольно неопределенного типа (например, Object
).
Наоборот, следующий вызов был бы совершенно однозначным:
char[] x = null;
doSomething(x);
Хотя вы по-прежнему передаете значение null
, Java точно знает, какой метод вызывать, поскольку он будет учитывать тип переменной.