Почему `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, тип выражения null, который не имеет имени. Поскольку нулевой тип не имеет имени, это невозможно объявить переменную нулевого типа или применить к нулевому типу. Нулевая ссылка - это единственное возможное значение выражения null тип. Нулевая ссылка всегда может быть применена к любому ссылочному типу. Нулевая ссылка всегда может быть назначена или применена к любому ссылочному типу
In практика, программист может игнорировать нулевой тип и просто притворяться что null - это просто специальный литерал, который может иметь любую ссылку тип
Таким образом, тип null неObject, хотя он может быть преобразован в (read-as assign to) a Object.