Wie kann ich List Rückkehr von einem Verfahren, in dem ich geschickt (Object) in eine Karte zu setzen (got Beispiel)
Frage
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 der Lage sein, in irgendwelchen Gegenständen in einer Karte zu senden und dann abzurufen, aber wie löse ich den genereics-Teil in Java?
Hier ist ein Beispiel-Code. Hier habe ich die Liste in der Karte speichern:
List<String> list = new ArrayList<String>();
list.add("a string");
session.set(KEY.LIST, list);
Jetzt möchte ich die Liste wieder bekommen:
List<String> list = session.getList(KEY.LIST);
Aber jetzt bekomme ich ein
cannot convert from List<E> to List<String>
Fehler aus offensichtlichen Gründen.
Ist es möglich, eine Liste (String) aus dem Verfahren, ohne Typumwandlungen zu bekommen? Ist das Verfahren korrekt?
public List<E> getList(KEY key) {
return (List<E>) getObj(key);
}
Lösung
Eine weitere Option Typ Löschung * zu überwinden, ist ein Verweis auf die Objektklasse zu übergeben, die Sie in der Rückkehr erwarten.
Sie erhalten auch eine Chance, einige Typprüfung zu tun.
public <E> List<E> getList(KEY key, Class<? extends E> elementClass)
{
Object o = getObj(key);
if ( ! (o instanceof List) ) throw new RuntimeException("Not a list value");
List l = (List)o;
if ( l.size() > 0 && !elementClass.isAssignableFrom( l.get(0) ) ) throw new RuntimeException("List element not valid type");
return (List<E>)l;
}
Sie nennen würde dies wie:
List<String> list = session.getList(KEY.LIST, String.class);
* mindestens Typ Löschung in der Erklärung des Verfahrens überwinden. Sie haben noch einige Castings in dem Verfahren Körper zu tun.
Andere Tipps
Sie können nicht lösen, dass wegen der Typ Löschung rel="nofollow. Das Beste, was Sie tun können, ist die Warnung zu unterdrücken, wenn Sie absolut sicher sind, dass die Besetzung nicht schief gehen kann.
Die Besetzung Sie gegeben haben, wird eine Warnung erzeugt, weil es nicht ist wirklich andere etwas Überprüfung als das Sie könnten ein MultiMap versuchen. Sie können mehrere Werte pro Schlüssel speichern. Google hat eine Implementierung . Apache commons hat wahrscheinlich eine Implementierung auch. getObj
gibt einen List
. In der Tat gibt es nichts, was man können wirklich effizient überprüfen, aufgrund
Statt einen List
in der Sitzung des Setzens, stellen eine Art, den Sinn in der Anwendungsdomäne macht. Zum Beispiel statt List<LineItem>
verwenden Order
:
public final class Order {
private final List<LineItem> lineItems;
[...]
}