Frage

Ich muss Java 1.4 verwenden und verwende ArrayList -Strukturen. Jetzt muss ich ein paar Re-Funktionen durchführen und es würde helfen, wenn ich Generika verwenden kann. Derzeit habe ich einen solchen Code

ArrayList rows = new ArrayList();

Das ist eine unkomplizierte Arraylist. Aber jetzt wird die Variable "Zeilen" komplexer und muss eine "Zeilen" -Klasse definieren. Ich möchte jetzt so etwas wie das tun, was Sie in J2SE 1.5 sehen

ArrayList<Row> rows = new ArrayList();

Ein Schleppnetz durch Google enthüllt keine Antworten ohne eine ausgefeilte Verwendung von Lösungen der Drittanbieter. Wie müsste sich mein Code ändern, um dies in 1,4 zu berücksichtigen, ohne Lösungen der Drittanbieter/Open Source -Projekte (wenn möglich) zu verwenden?

War es hilfreich?

Lösung

Generika wurden in JDK 1.5 eingeführt. Sie können sie also nicht in 1.4 verwenden. Möglicherweise können Sie jedoch JDK 1.5 -Compiler verwenden, zielen jedoch mit Ihren Klassen mit Ihren Klassen mit -target 1.4 Javac -Option während des Aufenthalts -source 1.5 Option, um anzuzeigen, dass Ihre Quelle 1,5 kompatibel ist. In diesem Fall können Sie Generika verwenden, da sie keine Ergebnisklassen beeinflussen sollten.

Sehen Sie sich den Abschnitt über Cross-Compilation-Optionen an

Andere Tipps

Generika neigt dazu, das Problem dessen anzugehen, was ich in Java 1.4 oder früher beim Umgang mit Sammlungen für "naive Besetzungen" hält. In Java 1.5+ der Linie, die Sie platziert haben:

ArrayList<Row> rows = new ArrayList();

Würde eine Warnung geben, der richtige generische Code ist

ArrayList<Row> rows = new ArrayList<Row>();

Dies teilt dem Compiler mit, dass Ihr ArrayList -Objekt immer nur den Zeilentyp enthalten sollte.

Da Java 1.5 jedoch mit riesigen Bibliothekssätzen, die diese Syntax nicht enthalten,, sondern eher Ihren vorherigen Code, rückwärtskompatibel ist:

ArrayList rows = new ArrayList();

Generika würden offensichtlich nicht mit diesen älteren Bibliotheken funktionieren - daher sind Generika nur ein Zeit kompilieren Option - Die Klassen von 1.5 und 1.4 sind effektiv gleichwertig (abzüglich aller internen Refactoring/neuen Methoden, die später hinzugefügt wurden), da es sich um wirklich ArrayList -Implementierungen handelt, die einen beliebigen Objekttyp verarbeiten.

Der 1.5 -Code fügt einfach eine direkte Besetzung für Sie hinzu.

In 1.4 Code, sagen Sie, Sie wollten über die ArrayList iterieren. Der naive Weg, dies zu tun, ist Folgendes:

for(Iterator rowIterator = rows.iterator(); rowIterator.hasNext(); ) {
    Row row = (Row) rowIterator.next();
    // Do something with the row.
}

Der Code von Java 1.5 entspricht genau der naiven Cast -Version. Es braucht die Tatsache, dass Sie dem Compiler sagen, dass es es ist eine Zeile und macht diesen Code für Sie. Die syntaktischen Zuckervorteile sind also schöner (dies verwendet die neuere für jede Schleifensyntax, generiert jedoch denselben Code wie die obige Schleife):

for(Row row : rows) {
   // Do something with the row
}

Wenn Sie also eine ArrayList mit nur Zeilen verwenden möchten, können Sie es trotzdem. Aber es gibt keine Möglichkeit, den Compiler dazu zu bringen überprüfen dass die ArrayList nur alle Zeilen enthält (obwohl der Compiler diesen Scheck bietet, ist dies jedoch immer noch möglich So senden Sie eine ArrayList, die andere Arten von Objekten enthält, da die ArrayList wiederum den Objekttyp immer noch wirklich umgeht und die Generika zur Laufzeit gelöscht werden - alles, was übrig bleibt, ist die naive Gusscode, die Sie nicht mehr sehen) .

Die nicht-naive Variante besteht darin, jede Instanz zu überprüfen und eine ClassCastException mit einer informativen Nachricht zu werfen (anstatt das Programm mit seiner Standardnachricht einen zu werfen):

for(Iterator rowIterator = rows.iterator(); rowIterator.hasNext(); ) {
    Object shouldBeRow = rowIterator.next();
    if(!(shouldBeRow instanceof Row)) {
        throw new ClassCastException("The object " + shouldBeRow + " is not an instance of Row - only Rows should be present in the list!");
    }
    Row row = (Row) shouldBeRow;
    // Do something with the row.
}

Im Allgemeinen tut dies jedoch niemand - eine gute Dokumentation kann dieses Problem in Anspruch nehmen, da es die Last der Bereitstellung der richtigen Sammlung auf dem Anrufer legt, und Sie können daher nur die ClassCastException von der JVM geworfen haben.

Ja, du kannst. Verwenden Sie einen 1.5 -Compiler und verwenden Sie

javac -target jsr14 ............

Dies erzeugt Java 1.4 -Klassen, erlaubt jedoch Generika.

Dieser Switch kann nur für nicht Byte -Code verwendet werden. 1,5 Funktionen. Zum Beispiel können Sie keine Enums verwenden oder neue Methoden, die in 1.5 eingeführt wurden. Aber Generika sind in Ordnung, da sie im Byte -Code nicht wirklich vorhanden sind.

Nein, Sie können sie nicht in JDK 1.4 verwenden. Sie wurden in JDK1.5 vorgestellt

Alles was Sie tun müssen, ist sie zu werfen. Dies könnte eine Laufzeitausnahme verdienen, wenn Sie "falsche" Typen in die Liste stecken.

Row arow = (Row) rows.get(0);

for ($i=0; i<rows.size(); $i++){
    Row element = (Row) rows.get($i);
    element.printCells();
    (...)
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top