Wenn mit Legacy-Code inter arbeitet, die einen Platzhalter nicht Typ Parameter für generische Typen angeben, verwenden. Beispiel: Angenommen, Sie eine Methode in einer älteren Bibliothek aufrufen, die einfach wieder ein rohes Collection
:
Collection getItems();
In Ihrem Code, um das Ergebnis zu einer Variablen mit einem Platzhalter erklärt zuweisen:
Collection<?> items = widget.getItems();
Diese Auf diese Weise bewahren Sie die Typsicherheit, so dass Sie keine Warnungen erhalten.
Der Legacy-Code könnte (in einem Kommentar, höchstwahrscheinlich) angeben, was die generischen Parameter sein sollten. Zum Beispiel:
/**
* @return the items, as a Collection of {@link Item} instances.
*/
Collection getItems();
In diesem Fall haben Sie die Wahl. Sie können das Ergebnis zu einem Collection<Item>
umwandeln, aber wenn Sie dies tun, verlassen Sie sich zu 100% auf die Third-Party-Bibliothek, und verwerfen die Versicherung von Java generischen Typen: dass jede zur Laufzeit ausgelöst ClassCastException
direkt an einer expliziten auftritt Besetzung.
Was passiert, wenn Sie der Drittanbieterbibliothek nicht vollständig vertrauen, aber trotzdem eine Collection<Item>
erstellen müssen? Erstellen Sie dann eine neue Sammlung, und fügen Sie den Inhalt hinzu, nachdem Sie sie in den erwarteten Typ umgewandelt haben. Auf diese Weise, wenn es einen Fehler in der Bibliothek gibt, erfährst du es sofort, anstatt einen Code weit weg zu haben und viel später auf mysteriöse Weise mit einer ClassCastException
zu explodieren.
Zum Beispiel:
Collection<?> tmp = widget.getItems();
Collection<Item> items = new ArrayList<Item>(tmp.size());
for (Object o : tmp)
items.add((Item) o); /* Any type error will be discovered here! */
Für einen Fall, in dem der Typparameter nicht zur Compile-Zeit bekannt ist, können Sie die type-checked collection factories der Collections
Klasse.
Das Problem ist, dass Sie nicht wirklich etwas anderes als das Schweigen der Warnungen "Rohtyp" gewinnen. Die Umstellung auf Generika würde die Vorteile nutzen! –
Welchen Nutzen haben Generika? Es soll Ihren Code nicht schön aussehen lassen und weniger Tipparbeit erfordern! Es ist dies: * Ihr Code ist garantiert typsicher, wenn er ohne Warnungen kompiliert wird. * Das ist es. Wenn Sie die Warnungen ignorieren oder unterdrücken, können Sie Generika überhaupt nicht verwenden, da Sie nur Situationen erstellen, in denen Code ohne einen Operator für die Umwandlung mysteriöserweise "ClassCastException" auslöst. – erickson