List <List > et List sont des types incompatibles en java

Je n’ai pas eu ce code à comstackr de toute façon:

List a = new ArrayList(); List<List> b = new ArrayList(); a = b; // incompatible types b = a; // incompatible types 

Il semble que Java ne considère pas que List et List Soient du même type en ce qui concerne les génériques.

Pourquoi donc? Et y a-t-il une belle sortie?

Le contexte

Il existe une fonction de bibliothèque avec la signature suivante: public Set<Class> getSubTypesOf(final Class type) public Set<Class> getSubTypesOf(final Class type) . Cela fonctionne bien pour les types simples passés en argument, mais dans le cas de génériques, le résultat n’est pas paramétré avec un caractère générique, javac se plaignant du type brut. Je souhaite propager le résultat au rest de mon application sous la forme Set<Class<? extends GenericTypeHere>> Set<Class<? extends GenericTypeHere>> mais la Set<Class<? extends GenericTypeHere>> simple ne fonctionne pas comme prévu.

EDIT: Solution

Merci pour les réponses, voici comment je le fais fonctionner à la fin:

 @SuppressWarnings({"rawtypes", "unchecked"}) private static Set<Class<? extends GenericTypeHere>> factoryTypes() { return (Set) new Reflections("...").getSubTypesOf(GenericTypeHere.class); } 

Bon, cela est dû à une différence sémantique subtile.

 List 

C’est le type brut de List , ce qui signifie que T est de type Object . Donc, c’est la même chose que de dire:

 List 

Maintenant, le compilateur sait pertinemment que, quoi qu’il se passe, il s’agit d’une sous-classe de type Object . Et si tu le fais ..

 List myList = new ArrayList(); myList.add(new Object()); 

Cela fonctionnera bien! Ceci est dû au fait que Object est le même ou qu’il s’agit d’une dérivation du type.

 List 

C’est littéralement une liste d’inconnus ( Java Docs ). Nous ne soaps même pas que la sous-classe des objects ici est de type Object . En fait, le ? type est un type inconnu tout seul. Cela n’a rien à voir avec Object ! C’est pourquoi quand vous essayez et faites ..

 List myList = new ArrayList(); myList.add(new Object()); 

Vous obtenez une erreur de compilation!

  List a = new ArrayList(); List> b = new ArrayList(); a = b; 

travaux

Set>>

impliquerait Set>> comme mentionné dans la réponse générique ci-dessus

Qu’est-ce qui vous empêche d’utiliser

Set> pour se propager dans votre application?