2017-04-18 4 views
0

Ich las Konzept des Typs löschen in Generika. Während ich den unten stehenden Code ausführte, war ich verwirrt.Typ löschen in Generika Verwirrung

public class CollectionsWild { 
    void Test(Collection<?> t){ 
     System.out.println("Collection"); 
    } 

    void Test(List<Integer> t){ 
     System.out.println("List"); 
    } 


    public static void main(String[] args) { 
     CollectionsWild o = new CollectionsWild(); 
     o.Test(new ArrayList<String>()); 
    } 

} 

Gemäß dem Löschkonzept Typ "List<Integer> t" auf "Liste t" in Bytecode umgewandelt. Warum wird mein Methodentest aufgerufen, der Collection als Parameter hat? Es hätte die Methode mit List als Parameter aufrufen sollen

+0

Danke, aber der Link, den Sie gaben, hängt nicht mit dem zusammen, was ich gefragt habe .. –

Antwort

2

Das hat nichts mit Löschen zu tun. Die Überladungsauflösung wird zur Kompilierungszeit durchgeführt. Nur eine Überladung entspricht ArrayList<String> und das ist die gewählte. Wenn es mehr als eine Übereinstimmung gab, wäre die spezifischste ausgewählt worden.

Im Fall der Überladung mit dem gleichen Typ löscht die Definition des Typs nicht, bevor die Überladungsauflösung überhaupt berücksichtigt wird.

2

Methodenauswahl ist eine Kompilierungszeit. Typ Löschung passiert danach. Wie Sie in JLS§15.12.2, generische Art sehen können Parameter werden betrachtet:

Die Entscheidung, ob ein Verfahren anwendbar Wille ist, im Fall von generischen Methoden (§8.4.4), erfordert eine Analyse der Typargumente.