Когда я вызываю doSomething(null) , компилятор выдает ошибку как неоднозначные методы. Итак, проблема в том, что Integer и char[] методы или Integer and Object методы?
Переведено автоматически
Ответ 1
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 точно знает, какой метод вызывать, поскольку он учитывает тип переменной.
Ответ 2
Каждая пара из этих трех методов неоднозначна сама по себе при вызове с null аргументом. Потому что каждый тип параметра является ссылочным типом.
Ниже приведены три способа вызвать один конкретный ваш метод с null.
Могу ли я предложить устранить эту двусмысленность, если вы действительно планируете вызывать эти методы с null аргументами. Такой дизайн может привести к ошибкам в будущем.
Ответ 3
null это допустимое значение для любого из трех типов; поэтому компилятор не может решить, какую функцию использовать. Вместо этого используйте что-то вроде doSomething((Object)null) или doSomething((Integer)null).
Ответ 4
Каждый класс в Java расширяет класс Object .Класс Even Integer также расширяет Object . Следовательно, и Object, и Integer рассматриваются как экземпляр объекта. Итак, когда вы передаете null в качестве параметра, компилятор путается в том, какой объектный метод вызывать, т.е. С параметром Object или параметром Integer, поскольку они оба являются object и их ссылка может быть null. Но примитивы в java не расширяют объект.