2016-03-31 1 views
19

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

System.out.println(null); 

Он показывает ошибку:

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

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

+2

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

+1

Возможный дубликат [невозможно передать null для выполнения(); метод AsyncTask в android 4.0] (http://stackoverflow.com/questions/10679739/unable-to-pass-null-to-execute-method-of-asynctask-in-android-4-0) – Raedwald

+1

См. также http : //stackoverflow.com/questions/13033037/how-is-an-overloaded-method-chosen-when-a-parameter-is-the-literal-null-value – Raedwald

ответ

25

Есть 3 println методы PrintStream, которые принимают ссылочный тип - 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); 
+1

Я знаю и понимаю эту концепцию. Но, ради полноты ответа, указывает ли JLS где-нибудь, почему, например, 'char []' и 'String' одинаково специфичны? В конце концов, 'char' является примитивным, а' String' является объектом. – Magnilex

+11

@Magnilex char является примитивным, но char [] является объектом. char [] не является подклассом String, а String не является подклассом char []. Поэтому ни один из них не является более конкретным. – Eran

+3

@KannanThangadurai Обратите внимание, что вы можете написать 'char x []' как 'char [] x' - many (например, [руководство по стилю Google] (https: // google.github.io/styleguide/javaguide.html#s4.8.3.2-array-declarations)) предпочитают последнюю форму, потому что тип 'x' является' char [] ', а не' char'. Сохранение типа вместе облегчает чтение. –

7

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

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

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

Или используйте null object pattern.


Why does't null represent Object?

От JLS 4.1 The Kinds of Types and Values

There is also a special null type, the type of the expression null, which has no name.
Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type.
The null reference is the only possible value of an expression of null type. The null reference can always be cast to any reference type.
The null reference can always be assigned or cast to any reference type

In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type

Так тип null является неObject, хотя он может быть преобразован в (для чтения, как назначен) в Object.

Смежные вопросы