Вопрос-ответ

How to do method overloading for null argument?

Как выполнить перегрузку метода для нулевого аргумента?

Я добавил три метода с параметрами:

public static  void doSomething(Object obj) {
System.out.println("Object called");
}

public static void doSomething(char[] obj) {
System.out.println("Array called");
}

public static void doSomething(Integer obj) {
System.out.println("Integer called");
}

Когда я вызываю 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.

doSomething( (Object) null);
doSomething( (Integer) null);
doSomething( (char[]) null);

Могу ли я предложить устранить эту двусмысленность, если вы действительно планируете вызывать эти методы с null аргументами. Такой дизайн может привести к ошибкам в будущем.

Ответ 3

null это допустимое значение для любого из трех типов; поэтому компилятор не может решить, какую функцию использовать. Вместо этого используйте что-то вроде doSomething((Object)null) или doSomething((Integer)null).

Ответ 4

Каждый класс в Java расширяет класс Object .Класс Even Integer также расширяет Object . Следовательно, и Object, и Integer рассматриваются как экземпляр объекта. Итак, когда вы передаете null в качестве параметра, компилятор путается в том, какой объектный метод вызывать, т.е. С параметром Object или параметром Integer, поскольку они оба являются object и их ссылка может быть null. Но примитивы в java не расширяют объект.

java oop