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
.