Pourquoi le type générique ne s’applique-t-il pas à l’argument étend la super classe pour les deux?

Voici le problème que je cherche à trouver la solution.

Nous avons deux définitions de classe. L’un des deux étend l’autre.

class T{} class TT extends T{} 

L’exigence est qu’il doit y avoir une liste garde l’object étend T

  List list = new ArrayList(); 

Mais le problème survient lorsque j’essaie de mettre un object TT (il semble à peine qu’il s’agisse d’une sous-classe de T) dans la liste.

  list.add(new TT()); 

Message d’erreur de compilation

La méthode add (capture # 2-of? Extend Cell) dans le type List n’est pas applicable pour les arguments (Cell)

Vous pouvez créer une List list = new ArrayList(); directement, cela peut autoriser tous les sous-types de T dans la liste. C’est en fait peu difficile à comprendre. quand vous le déclarez comme

 List list = ... 

Cela signifie qu’il peut autoriser tous les sous-types inconnus de T dans la liste. Mais, à partir de cette déclaration, nous ne pouvons pas déterminer quel est le sous-type exact de T oui, on ne peut append que null

List List indique que tout ce qui peut en sortir peut être converti en T, ainsi la vraie liste pourrait être l’un des suivants:

  • List
  • List
  • List
  • etc

Vous pouvez voir que même un nouveau T ne peut pas être ajouté en toute sécurité à une telle collection car il pourrait s’agir d’une List laquelle T ne peut pas être inséré. En tant que telle, une telle liste ne peut pas avoir d’entrées non nulles.

Dans ce cas, vous voudrez peut-être simplement List

Alors, pourquoi utiliseriez-vous cela?!

Cette contravariance peut être utile pour les parameters de méthode ou les retours, dans lesquels une collection sera lue plutôt que ajoutée. Une utilisation de cette option pourrait consister à créer une méthode qui accepte toute collection contenant des éléments T ou des extensions T.

 public static void processList(Collection list){ for(Vector3d vector:list){ //do something } } 

Cette méthode peut accepter n’importe quelle collection d’objects qui étend Vector3d. ArrayList serait donc acceptable.

De même, une méthode pourrait renvoyer une telle collection. Un exemple de cas d’utilisation est décrit dans Retour d’une collection à partir d’une méthode spécifiant qu’elle renvoie Collection .

L’exigence est qu’il doit y avoir une liste garde l’object étend T

Si vous voulez juste une List où vous pouvez stocker des objects de n’importe quelle classe s’étendant de T , créez simplement une List comme ceci:

 List list = new ArrayList(); 

La manière dont vous avez créé une liste ne vous permettra pas d’append quoi que ce soit, sauf null .

Des règles de délimitation sont définies pour Java Generics lors de l’utilisation de WildCards.

  **extends Wildcard Boundary** 

Liste signifie une liste d’objects qui sont des instances de la classe T, ou des sous-classes de T (par exemple, TT). Cela signifie qu’une lecture est correcte, mais l’insertion échouerait car vous ne sauriez pas si la classe est typescripte ou non.

 **super Wildcard Boundary** 

Lorsque vous savez que la liste est typée soit dans T, soit dans une superclasse de T, vous pouvez insérer des instances de T ou des sous-classes de T (egTT) dans la liste.

Dans votre exemple, vous devriez utiliser “super”