2009-07-23 6 views
1

In vielen Büchern wird gesagt, dass der Grund für die generische Verwendung von Java ist Löschen Kompatibilität mit Legacy-Code zu haben.Generics löschen und Legacy-Code

Ok, sehr gut, aber kann mir jemand einige einfache Beispiele zeigen, wo einige generische Codes mit dem alten Legacy Code interagieren und umgekehrt?

Antwort

3

Hier ist ein Beispiel, das nicht möglich ohne Typen Löschung wäre:

public static void main(String[] args) { 
    List<String> newList = legacyMethod(); 

    for (String s : newList) { 
     System.out.println(s); 
    } 
} 

public static List legacyMethod() { 
    List oldList = new ArrayList(); 
    oldList.add("a"); 
    oldList.add("b"); 
    oldList.add("c"); 
    return oldList; 
} 
+0

Es ist kein sehr gutes Beispiel, das alte und das neue in der gleichen Methode zu haben. –

+0

Ich denke, dein Recht ... zu Methode geändert –

3

Kompatibilität mit dem alten Code bedeutet, dass er auf der neuen Version von JVM ohne Kompilierung ausgeführt werden kann. Nehmen wir an, Sie haben eine ältere Bibliothek ohne Quellcode. Dies stellt sicher, dass Sie es auf Java 5 ausführen können. Ihr neuer Code wird Legacy-Code ohne Probleme aufrufen können.

1

Run alter Code auf einem aktuellen JRE und die Verwendungen von Größen wie List wird alter Code neu. Methoden saugen als Collections.sort wird neuer Code zurückrufen zu alt.

0

Nehmen Sie eine alte Java-Bibliothek, die noch nicht auf Java 5 portiert wurde. Sie finden viele Orte, an denen der alte Code zurückgibt oder List akzeptiert. Ohne Löschen könnten Sie keine Generics in Ihrem Code verwenden (um Ihr Leben einfacher zu machen) und Ihre Listen als Parameter an das Framework übergeben, ohne (flach) das Ganze zu kopieren - List und List<String> wären so verschieden wieund File.

Auf ähnliche Weise, wenn die Bibliothek eine Liste zurückgibt, müssen Sie entweder die pre-5-Syntax mit einem Iterator verwenden, um sie zu verarbeiten oder die Basisliste in eine generierte zu kopieren.

Es gäbe eine Möglichkeit, das zu umgehen. Sun hätte List gleich List<Object> oder, Gott bewahre, List<?> gemacht haben können. Aber das hätte noch subtilere Probleme mit sich gebracht. Also entschieden sie sich dafür, den Weg des geringsten Widerstands zu gehen und die generischen Informationen (meistens) während der Kompilation zu verwenden.