Почему `System.out.println(null);` give 'Метод println (char []) неоднозначен для типа ошибки PrintStream "?
Я использую код:
System.out.println(null);
Показывает ошибку:
The method println(char[]) is ambiguous for the type PrintStream
Почему null
не представляет Object
?
Ответы
Ответ 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
.