Comment puis-je convertir à partir de la liste & lt;? & Gt; à la liste & lt; T & gt; en Java en utilisant des génériques?

En Java, comment puis-je convertir des List<?> à List<T> à l'aide d'une méthode usage général, de sorte que je peux remplacer des modèles comme la suivante avec un seul appel de méthode:

List untypedList = new ArrayList();  //or returned from a legacy method
List<Integer> typedList = new ArrayList<Integer>();
for (Object item: untypedList)
    typedList.add((Integer)item);

Noter que le code ci-dessus ne permet pas de générer n'importe quel type-avertissements de sécurité et, idéalement, votre solution ne devrait pas générer de tels avertissements, soit.

Sera la solution suivante travail à condition que la liste Class<L> dispose d'un constructeur par défaut?

public class ListUtil {
    public static <T, L extends List<T>> L typedList(List<?> untypedList, Class<T> itemClass, Class<L> listClass) {
        L list = null;
        try {
            list = listClass.newInstance();
        } catch (InstantiationException e) {
        } catch (IllegalAccessException e) {
        }
        for (Object item: untypedList)
            list.add(itemClass.cast(item));
        return list;
    }
}

(Notez que listClass.newInstance() jette InstantiationException ou IllegalAccessException si une instance de Class<L> ne pas avoir un public de constructeur par défaut. Quels sont les problèmes qui peuvent survenir si la méthode ne permet pas de gérer correctement ces exceptions?)

Notes:

  • T est le type de chaque élément dans la liste.
  • L est le type de la liste que je souhaite créer (qui s'étend à List<T>).
  • untypedList est le "non typé" liste d'entrée, effectivement la même que List<Object>.
  • itemClass représente la classe d'exécution de T.
  • listClass représente la classe d'exécution de L.

source d'informationauteur Derek Mahar