2016-06-07 5 views
0

Betrachten Sie die folgende Klasse mit überladenen Methoden.Überladen von Methoden mit Auflistungstypen funktioniert nicht wie erwartet

public final class TeaParty { 
    private void travellerListed(Collection o) { 
    System.out.println("travellerListed(Collection<?>)"); 
    } 
    private void travellerListed(List s) { 
    System.out.println("travellerListed(List<Number>)"); 
    } 
    private void travellerListed(ArrayList i) { 
    System.out.println("travellerListed(ArrayList<Integer>)"); 
    } 

    private void method(List t) { 
    travellerListed(t) ; 
    } 

    public static void main(String[] args) { 
     TeaParty test = new TeaParty(); 
     test.method(new ArrayList()); 
    } 
} 

Ich erwarte "travellerListed (ArrayList)" als Ausgabe. Aber ich bekomme "travellerListed (Collection)". Was verursacht diese unerwartete Überlastung?

+0

Hinweis zur Terminologie: das sind keine "generischen" Typen (aus Sicht der "Generika" verwenden Sie hier eigentlich ** rohe ** Typen; die ... sollten niemals an erster Stelle verwendet werden). Es geht also nur um Überladung und welche Version der Compiler wählt. Und wenn du genauer hinsiehst ... findest du ja, du überlädst; aber du nennst hier niemals eine überladene Methode! – GhostCat

+1

Über allgemeine Typen (die in Ihrer Frage nicht relevant sind): Generische Typen werden nur beim Kompilieren verwendet. Zur Laufzeit sind generische Typen nicht verfügbar (Typ löscht), so dass Sie zum Beispiel 'void tristorerListed (Liste value)' zusammen mit 'void trollerListed (Liste value)' nicht haben, weil diese Signaturen zur Laufzeit identisch sind. –

Antwort

3

Eigentlich der Code geschrieben Sie Ergebnisse in "travellerListed(List<Number>)", da Sie die ArrayList-method sind vorbei, deren Argument Typ ist ein List, so für den Anruf zu travellerListed der Compiler private void travellerListed(List s), da Methode Überlastung Auflösung wählt durch die compile- bestimmt wird Zeittyp der Argumente (was bedeutet private void travellerListed(ArrayList i) kann nicht gewählt werden), und ein List ist ein spezifischerer Typ als Collection (was erklärt, warum private void travellerListed(Collection o) nicht gewählt wird).

Verwandte Themen