2016-08-28 4 views
0

Welche überladene Methode wird für die folgende Methode aufgerufen und warum?Null an die ambitionierte überladene Methode übergeben

Ich habe diesen Code ausgeführt und es ruft die überladene Methode mit List aber warum passiert es?

public class AmbigiousOverload { 

    public static void add(Object o) { 
     System.out.println("Overloaded method with Object."); 
    } 

    public static void add(List l) { 
     System.out.println("Overloaded method with List."); 
    } 

    public static void main(String[] args) { 
     add(null); 
    } 

} 

Output: Overloaded method with List.

+0

"Welche überladene Methode wird aufgerufen" Sie wissen welche. Es ist in deiner Frage. –

Antwort

1

Die List Überlastung genannt wird, weil die List Überlastung der spezifischste passende Überladung ist, da alle Implementierungen List Subklassen von Object sind.

Von JLS Sec 15.12.2.5:

Die informelle Intuition ist, dass ein Verfahren präziser ist als ein anderes, wenn eine durch das erste Verfahren behandelt Aufruf auf dem anderen ohne Fehler bei der Kompilierung weitergegeben werden konnten.

Da jeder Parameter, den Sie add(List) passieren kann, kann auch an add(Object) weitergegeben werden, ist add(List) spezifischer. Da null an beide weitergegeben werden kann, ist die spezifischere Methode die gewählte Methode.

Beachten Sie, dass es nicht kompilieren würde, wenn Sie eine add(String) Überladung hätten, da List und String "gleich" spezifisch sind. (Oder eine andere Klasse: es muss nicht String sein).

+0

Wie wird die "Liste" als spezifisch für "Objekt" betrachtet? 'List' ist eine Schnittstelle und keine Klasse. –

+0

Alle 'List' Implementierungen sind' Object '. –

Verwandte Themen