web-dev-qa-db-fra.com

List <Object> et List <?>

J'ai deux questions, en fait .... ... Tout d'abord, pourquoi ne puis-je pas faire ceci:

List<Object> object = new List<Object>();

Et deuxièmement, j'ai une méthode qui retourne un List<?>, comment puis-je la transformer en un List<Object>, pourrais-je simplement la lancer? 

Je vous remercie!

17
Chris

Pourquoi ne puis-je pas faire ceci:

List<Object> object = new List<Object>();

Vous ne pouvez pas faire cela car List est une interface et les interfaces ne peuvent pas être instanciées. Seules les classes (concrètes) peuvent être. Des exemples de classes concrètes implémentant List incluent ArrayList , LinkedList etc.

Voici comment créer une instance de ArrayList:

List<Object> object = new ArrayList<Object>();

J'ai une méthode qui retourne un List<?>, comment puis-je le transformer en un List<Object>

Montrez-nous le code approprié et je mettrai à jour la réponse.

35
NPE
List<Object> object = new List<Object>();

Vous ne pouvez pas faire cela carListest une interface et vous ne pouvez pas créer d'objet d'une interface ou dans un autre mot que vous ne pouvez instancier aucune interface. De plus, vous pouvez affecter n'importe quel objet de classe qui implémente List à sa variable de référence. Par exemple, vous pouvez faire ceci: 

list<Object> object = new ArrayList<Object>();

IciArrayListest une classe qui implémenteList, vous pouvez utiliser n’importe quelle classe qui implémenteList

4
Chandra Sekhar

List est une interface, vous ne pouvez donc pas l'instancier. Utilisez l'une de ses implémentations à la place, par exemple.

List<Object> object = new List<Object>();

A propos de la liste: Vous pouvez utiliser n’importe quel objet en tant que paramètre générique pour son instance:

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

ou

List<?> list = new ArrayList<Integer>();

Si vous utilisez List<Object>, cette déclaration n’est pas valide car elle sera de type missmatch.

2
Alex Stybaev

Pour répondre à votre deuxième question, vous pouvez convertir le List<?> en List<Object> ou List<T> de tout type, puisque le paramètre ? (Wildcard) indique que la liste contient une collection homogène de anyObject. Cependant, il est impossible de savoir à la compilation ce qu'est la type puisqu'elle fait uniquement partie de l'API exportée - ce qui signifie que vous ne pouvez pas voir ce qui est inséré dans le List<?>.

Voici comment vous feriez le casting:

List<?> wildcardList = methodThatReturnsWildcardList();
// generates Unchecked cast compiler warning
List<Object> objectReference = (List<Object>)wildcardList;

Dans ce cas, vous pouvez ignorer l'avertissement, car pour qu'un objet soit utilisé dans une classe générique, il doit être un sous-type de Object. Supposons que nous essayons de convertir ceci en un List<Integer> alors qu'il contient en réalité une collection de Strings.

// this code will compile safely
List<?> wildcardList = methodThatReturnsWildcardList();
List<Integer> integerReference = (List<Integer>)wildcardList;

// this line will throw an invalid cast exception for any type other than Integer
Integer myInteger = integerRefence.get(0);

Rappelez-vous: les types génériques sont effacés au moment de l'exécution. Vous ne saurez pas ce que contient la collection, mais vous pouvez obtenir un élément et appeler .getClass() pour déterminer son type.

Class objectClass = wildcardList.get(0).getClass();
0
Ian R. O'Brien