Зачем бросать 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" не имеет типа - вы получите ошибку компиляции.