Подтвердить что ты не робот

Почему `System.out.println(null);` give 'Метод println (char []) неоднозначен для типа ошибки PrintStream "?

Я использую код:

System.out.println(null);

Показывает ошибку:

The method println(char[]) is ambiguous for the type PrintStream

Почему null не представляет Object?

4b9b3361

Ответ 1

В PrintStream есть методы println, которые принимают ссылочный тип - println(char x[]), println(String x), println(Object x).

Когда вы проходите null, все 3 применимы. Правила перегрузки метода предпочитают метод с наиболее конкретными типами аргументов, поэтому println(Object x) не выбран.

Тогда компилятор не может выбрать между двумя первыми - println(char x[]) и println(String x) - поскольку String не более конкретный, чем char[] и наоборот.

Если вы хотите, чтобы выбранный метод был выбран, введите нуль в требуемый тип.

Например:

System.out.println((String)null);

Ответ 2

Если вы вызываете System.println(null), существует несколько методов-кандидатов (с аргументами char [], String и Object), и компилятор не может решить, какой из них выполнить.

Исправить
Добавить явное преобразование в null.

System.out.println((Object)null);

Или используйте шаблон нулевого объекта.


Почему do't null представляет Object?

От JLS 4.1 Виды типов и значений

Существует также специальный тип null, тип выражения null, который не имеет имени.
Поскольку нулевой тип не имеет имени, это невозможно объявить переменную нулевого типа или применить к нулевому типу.
Нулевая ссылка - это единственное возможное значение выражения null тип. Нулевая ссылка всегда может быть применена к любому ссылочному типу.
Нулевая ссылка всегда может быть назначена или применена к любому ссылочному типу

In практика, программист может игнорировать нулевой тип и просто притворяться что null - это просто специальный литерал, который может иметь любую ссылку тип

Таким образом, тип null не Object, хотя он может быть преобразован в (read-as assign to) a Object.