Konvertieren von nicht-generischen Listentypen in generische Listentypen in Java 1.5
Habe ich eine Liste, die garantiert enthalten nur eine Art Objekt. Dies ist durch einige zugrunde liegende code in eine Bibliothek, die ich nicht aktualisieren kann. Ich möchte eine Liste erstellen<ObjectType> basierend auf der eingehenden Liste-Objekt, so dass meine Berufung-code spricht to List<ObjectType>.
Was ist der beste Weg, um zu konvertieren der Liste (oder jedes andere Objekt-Sammlung), um eine Liste<ObjectType>.
InformationsquelleAutor der Frage Shaun F | 2009-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn inter-Betrieb mit legacy-code nicht angeben, geben Sie Parameter für generische Typen verwenden Sie einen Platzhalter. Angenommen, Sie sind eine Methode aufrufen, die in einer älteren Bibliothek, gibt einfach eine raw -
Collection
:In Ihrem code, weisen das Ergebnis der Variablen deklariert, mit einem wildcard:
Diese Weise bewahren Sie geben Sicherheit, so dass Sie nicht alle Warnungen.
Legacy-code angeben (in einem Kommentar, die meisten wahrscheinlich), was die generischen Parameter werden sollte. Zum Beispiel:
In diesem Fall haben Sie die Wahl. Sie kann cast das Ergebnis einer
Collection<Item>
aber wenn Sie tun, Sie verlassen sich 100% auf die Drittanbieter-Bibliothek und somit die Qualitätssicherung von Java auf generische Typen:, dass jederClassCastException
ausgelöst zur Laufzeit auftreten wird, direkt an einen expliziten cast.Was, wenn Sie nicht vollständig Vertrauen, die Drittanbieter-Bibliothek, aber immer noch brauchen, um zu produzieren ein
Collection<Item>
? Eine neue Sammlung erstellen, und fügen Sie den Inhalt nach dem Guss Sie mit dem erwarteten Typ. So, wenn es ein bug in der Bibliothek, erfahren Sie es sofort, anstatt einige code-weit Weg und viel später auf mysteriöse Weise Luft zu sprengen mit einemClassCastException
.Beispiel:
Für einen Fall, wo der Typ-parameter nicht bekannt ist zur compile-Zeit, die Sie verwenden können, die Typ-geprüft Sammlung Fabriken der
Collections
Klasse.InformationsquelleAutor der Antwort erickson
Können Sie einfach werfen die Liste:
InformationsquelleAutor der Antwort daveb
Die beste und sicherste Weg ist die Verwendung von java.util.Sammlungen Methode 'checkedList(Liste, Liste, Klasse, Art)'
Mit dieser Methode alle Elemente in Ihre alte Liste wird überprüft, so früh wie möglich.
InformationsquelleAutor der Antwort nanda
Versuchen Sie dies:
Aber denken Sie daran, dass dies zu einem festen Länge der Liste. Wenn Sie versuchen, hinzufügen oder entfernen element aus dieser Liste, wird es werfen eine Fehlermeldung. Also immer vorsichtig sein, während Sie
- Arrays.asList()
.InformationsquelleAutor der Antwort sluimers
Wenn Sie einfach nur werfen, um
List<T>
in jedem Alter Ort, erhalten Sie ein "ungeprüft" compiler-Warnung. Wir beschlossen, dass, indem Sie es zu einer utility-Methode.Anrufer bekommt nun keine Warnung, z.B.:
Dass
checkedList
- Dienstprogramm ist in der Theorie eine tolle Idee, aber in der Praxis nervt es zu haben, um pass in der Klasse, die Sie erwarten. Ich hoffe, dass Java erhalten Laufzeit generische Eingabe von Informationen schließlich.InformationsquelleAutor der Antwort Trejkaz