2016-03-31 21 views
19

Ich bin mit dem Code:Warum ist `System.out.println (null);` give "Die Methode println (char []) ist mehrdeutig für den Typ PrintStream error"?

System.out.println(null); 

Es wird den Fehler zeigt:

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

Warum null nicht Object repräsentieren?

+2

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

+1

Mögliches Duplikat von [unable to null übergeben an execute(); Methode von AsyncTask in Android 4.0] (http://stackoverflow.com/questions/10679739/unable-to-pass-null-to-execute-method-of-asynctask-in-android-4-0) – Raedwald

+1

Siehe auch http : //stackoverflow.com/questions/13033037/how-ist-overloaded-method-chosen-when-a-parameter-is-the-literal-null-value – Raedwald

Antwort

25

Es gibt 3 println Methoden in PrintStream, die einen Referenztyp akzeptieren - println(char x[]), println(String x), println(Object x).

Wenn Sie null übergeben, sind alle 3 anwendbar. Die Überladungsregeln für Methoden bevorzugen die Methode mit den spezifischsten Argumenttypen. Daher wird println(Object x) nicht ausgewählt. println(char x[]) & println(String x) - -

Dann kann der Compiler nicht zwischen den ersten beiden wählen, da String nicht spezifischer als char[] ist und umgekehrt.

Wenn Sie eine bestimmte Methode auswählen möchten, müssen Sie die Null auf den gewünschten Typ umwandeln.

Zum Beispiel:

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

Ich kenne und verstehe dieses Konzept. Aber um der Vollständigkeit der Antwort willen spezifiziert die JLS irgendwo, warum zum Beispiel 'char []' und 'String' gleichermaßen spezifisch sind? Schließlich ist "char" ein Primitiv und "String" ist ein Objekt. – Magnilex

+11

@Magnilex char ist ein Primitiv, aber char [] ist ein Objekt. char [] ist keine Unterklasse von String und String ist keine Unterklasse von char []. Daher ist keiner der beiden spezifischer. – Eran

+3

@KannanThangadurai Beachten Sie, dass Sie 'char x []' als 'char [] x' - viele schreiben können (z. B. [google style guide] (https: // google.github.io/styleguide/javaguide.html#s4.8.3.2-array-declarations)) bevorzugen die letztere Form, weil der Typ von 'x'' char [] 'ist, nicht' char'. Wenn Sie den Typ zusammenhalten, ist das Lesen leichter. –

7

Wenn Sie rufen System.println(null) es mehrere Kandidaten Methoden (mit char [], String und Object Argument) und der Compiler kann nicht entscheiden, welches zu nehmen.

Fix
Fügen Sie eine explizite Umwandlung zu null hinzu.

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

Oder verwenden Sie null object pattern.


Why does't null represent Object?

Von 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

So ist die Art von null ist nichtObject, obwohl es umgerechnet werden können (zugewiesen als schreib to) eine Object.