Comment renvoyer List < String > à partir d'une méthode où j'ai envoyé mettre (Object) dans une carte (exemple obtenu)

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

Question

J'ai le code suivant

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);
}

L'idée de pouvoir envoyer n'importe quel objet dans une carte puis de la récupérer, mais comment puis-je résoudre la partie générique en java?

Voici un exemple de code. Ici, je sauvegarde la liste sur la carte:

    List<String> list = new ArrayList<String>();

    list.add("a string");

    session.set(KEY.LIST, list);

Je souhaite maintenant obtenir à nouveau la liste:

List<String> list = session.getList(KEY.LIST);

Mais maintenant je reçois un

cannot convert from List<E> to List<String>

erreur pour des raisons évidentes.

Est-il possible d’obtenir une liste (String) à partir de la méthode, sans typecasts? Cette méthode est-elle correcte?

public List<E> getList(KEY key) {
    return (List<E>) getObj(key);
}
Était-ce utile?

La solution

Une autre option pour éviter l'effacement du type * consiste à transmettre une référence à la classe d'objet attendue dans le retour.

Vous avez également la possibilité de faire une vérification de type.

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;
}

Vous appelez ceci comme suit:

List<String> list = session.getList(KEY.LIST, String.class);

* au moins surmonter l'effacement de type dans la déclaration de la méthode. Vous devez encore faire un casting dans le corps de la méthode.

Autres conseils

Vous ne pouvez pas résoudre ce problème à cause du type effacement . Le mieux que vous puissiez faire est de supprimer l'avertissement si vous êtes absolument sûr que le casting ne peut pas mal tourner.

La distribution que vous avez donnée générera un avertissement, car ce n'est pas vraiment en train de vérifier quoi que ce soit autre que getObj renvoie une liste . En fait, il n'y a rien que vous puissiez vraiment vérifier efficacement, en raison de tapez effacement - au moment de l'exécution, vous aurez une liste contenant des chaînes, mais c'est tout.

Vous pouvez certainement vérifier que tout dans la liste est une chaîne (ou null), mais il s'agit d'une opération O (n). Ou vous pouvez simplement faire le casting, supprimer l'avertissement et espérer ... Dans ce cas, vous n'obtiendrez une exception que si et quand vous frappez un non-chaîne.

Vous pouvez essayer une carte multiple. Vous pouvez stocker plusieurs valeurs par clé. Google a une mise en œuvre . . Apache commons a probablement une implémentation également.

Au lieu de mettre une Liste dans la session, introduisez un type qui ait du sens dans le domaine d'application. Par exemple, au lieu de List < LineItem > , utilisez Commande :

public final class Order {
    private final List<LineItem> lineItems;
    [...]
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top