Зачем бросать null в Object?

Я нашел пятно в некотором коде, над которым я работаю, где null передается в Object, поскольку он передается методу.

Зачем это делать?

Я знаю этот вопрос, который посвящен перегруженным методам, и используя приведение, чтобы определить, какую версию метода вызывать.

Но если приведение не выполнялось, не был бы ли перегруженный метод с параметром, введенным как Object, по любой другой подходящей версии метода, если метод вызывается с нулевым аргументом? Итак, что еще делает бросок?

Ответ 1

Если листинг, в котором не, будет выбрана версия наиболее подходящая.

null может быть нулевой ссылкой типа String или типа Object. Поэтому, если эти два метода доступны, тогда вызывается метод String.

Если у вас есть методы с Object, Integer и String, то вызов с null (и без приведения) даст ошибку компиляции, потому что Integer и String являются действительными и одинаково конкретными (т.е. ни один не является специализацией другого). В этом случае у есть, чтобы указать null, чтобы указать, какой метод вызывать.

Ответ 2

Метод "Object" всегда является "наименее конкретным" методом среди всех "применимых методов". Вот почему он не будет выбран компилятором.

Если вы запустите

String.valueOf(null);

Тогда у компилятора есть выбор из двух "применимых методов". Вы на самом деле называете более конкретный метод

String.valueOf((char[]) null);

Что даст вам NullPointerException. Чтобы вызвать другой метод, напишите

String.valueOf((Object) null);

В этом случае вы остаетесь только с одним "применимым методом", поэтому у вас нет проблемы с другим перегруженным методом, который является "более конкретным".

Ответ 3

Хотя предыдущие ответы уже объясняют, что произойдет, если вы передадите null в Object vs., если вы не передаете значение null объекту, но я все равно хотел бы добавить несколько недостающих точек.

Итак, в Java "массивы" - это объекты, которые означают, что они могут быть привязаны к типу объекта, т.е. если вы выполняете new char[0].getClass().getSuperclass(), он дает java.lang.Object, и поэтому в случае, когда null не явно используется, компилятор выбирает valueOf(char[]) over valueOf(Object) как наиболее применимый метод.

Однако появляется недостающая часть, если был другой перегруженный метод, принимающий параметр типа интерфейса (запомнить интерфейс не расширяет класс Object, поэтому они также вызывают неоднозначность в большинстве выбор конкретного метода), например valueOf (CharSequence), то это привело бы к ошибке времени компиляции (т.е. ссылка на valueOf неоднозначна), потому что тогда компилятор не мог выбрать наиболее применимый метод.

Таким образом, нижняя строка избегает передачи raw null в качестве аргументов в методы, а скорее приводит их к типу param вызываемого метода.:)

Ответ 4

"Но если бросок не выполнялся, не был бы перегруженный метод с параметром, введенным как Object, выбираться над любой другой подходящей версией метода, если метод вызывается с нулевым аргументом?"

Нет, потому что "null" не имеет типа - вы получите ошибку компиляции.