Wie kann ich zurückgeben der Liste<String> eine Methode, wo ich an setzen(Objekt) in eine Karte (habe Beispiel)
Ich habe den folgenden code
private Map<KEY, Object> values = new HashMap<KEY, Object>();
public void set(KEY key, Object value) {
values.put(key, value);
}
private Object getObj(KEY key) {
return values.get(key) == null ? key.getDefaultValue() : values.get(key);
}
public List<E> getList(KEY key) {
return (List<E>) getObj(key);
}
Die Idee, in der Lage sein zu senden, in der alle Objekte in einer Karte und abrufen, aber wie löse ich die genereics-Teil in java?
Hier ist ein Beispiel code. Hier Speichere ich die Liste in die Karte:
List<String> list = new ArrayList<String>();
list.add("a string");
session.set(KEY.LIST, list);
Nun möchte ich, um die Liste wieder:
List<String> list = session.getList(KEY.LIST);
Aber jetzt bekomme ich eine
cannot convert from List<E> to List<String>
Fehler aus offensichtlichen Gründen.
Ist es möglich, eine Liste(String), die aus der Methode, ohne Typumwandlungen? Ist diese Methode korrekt?
public List<E> getList(KEY key) {
return (List<E>) getObj(key);
}
InformationsquelleAutor corgrath | 2009-09-14
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere Möglichkeit zur überwindung type-erasure* ist die übergabe einer Referenz auf das Objekt, Klasse, erwarten Sie, dass in der Rückkehr.
Erhalten Sie auch eine chance, um einige der Typ-überprüfung.
Würden Sie dies nennen mögen:
*mindestens überwunden type-erasure in der Deklaration der Methode. Sie müssen noch etwas Guss in die Methode Körper.
Können Sie nicht lösen, weil der type erasure. Das beste, was Sie tun können, ist zu unterdrücken der Warnung, wenn Sie absolut sicher sind, dass die Besetzung kann nichts schief gehen.
Die Besetzung, die Sie gegeben haben, wird eine Warnung generieren, weil es nicht wirklich Prüfung etwas anderes, als
getObj
gibt eineList
. In der Tat, es gibt nichts, was Sie kann wirklich überprüfen effizient, aufgrund type erasure - bei der Ausführung haben Sie einList
was passiert, zu enthalten Zeichenfolgen, aber das ist alles.Könnte man sicherlich überprüfen, dass alles in der Liste ist eines Strings (oder null), aber das ist eine O(n) - operation. Oder Sie könnten einfach die Besetzung, Unterdrückung der Warnung und der Hoffnung..., in dem Fall erhalten Sie lediglich eine Ausnahme, wenn und wenn Sie auf einem nicht-string.
Könnten Sie versuchen, eine MultiMap. Können Sie speichern mehrere Werte pro Schlüssel. Google hat eine Umsetzung. Apache commons hat wahrscheinlich eine Umsetzung auch.
Anstatt eine
List
in der Sitzung, die Einführung einer Art, die Sinn in der Anwendungsdomäne. Zum Beispiel, anstattList<LineItem>
verwendenOrder
: