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