Wie kann ich List Rückkehr von einem Verfahren, in dem ich geschickt (Object) in eine Karte zu setzen (got Beispiel)

StackOverflow https://stackoverflow.com/questions/1422448

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);
}
War es hilfreich?

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 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;
    [...]
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top