2014-02-16 7 views
13

hier So ist es in diesem BeispielWas ist der Typ bei null als Methodenargument?

public static void main(String[] args) {   
    new Stuff(null); 
    new Stuff("a"); 
    new Stuff(1);   
} 

und Klasse Stuff ist wie folgt

public class Stuff {  
     Stuff(Object o){ 
      System.out.println("object");   
     } 

     Stuff(String s){ 
      System.out.println("string");   
     } 

} 

Der Ausgang ist

string 
string 
object 

Wie funktioniert Java die null ist ein String sagen definiert? Wenn ich Stuff zu

public class Stuff {  

     Stuff(String s){ 
      System.out.println("string");   
     } 

     Stuff(Integer o){ 
      System.out.println("Integer");   
     } 

} 

ich Fehler erhalten Kompilierung ändern für Stuff(null):

The constructore Stuff(String) is ambigous. 

Wieder warum Java "entscheiden" null ist ein String?

+1

Da String ist am nächsten zu "null" unter allen anderen: "* Die Java-Programmiersprache verwendet die Regel, dass die spezifischste Methode gewählt wird *". – Maroun

+2

Erwähnenswert ist, dass 'null' keine Zeichenfolge oder ein Objekt oder eine ganze Zahl ist. (Es ist nur das explizite Fehlen von ihnen). –

+1

Da der Kommentar nicht generiert wird: Mögliches Duplikat von http://StackOverflow.com/q/13033037/1864167 –

Antwort

19
  • Der Compiler listet zuerst alle anwendbaren Methoden auf. In Ihrem Fall sind beide anwendbar.
  • Es versucht dann, eine Methode zu finden, die spezifischer als die anderen ist. In Ihrem ersten Beispiel ist String eine Unterklasse von Object und ist daher spezifischer.
  • In Ihrem zweiten Beispiel sind beide Methoden anwendbar (String und Integer), aber keiner ist spezifischer als der andere (String ist keine Unterklasse von Integer, die keine Unterklasse von String ist). Es gibt also eine Mehrdeutigkeit, daher der Compilerfehler.

Der vollständige Algorithmus, um zu bestimmen, welche Methode gewählt werden sollte, ist in der JLS definiert.

6

Da String spezifischer ist als Objekt. Java versucht immer, eine spezifischere Übereinstimmung zu verwenden, wenn es darum geht herauszufinden, welcher Konstruktor oder welche Methode verwendet werden soll.

+0

+1 und Weder Ganzzahl oder String ist spezifischer als die anderen. –