Définition des limites supérieures et inférieures dans les génériques
Limite supérieure extend Fruit>
Limite inférieure< Apple>
Caractéristiques des limites supérieures et inférieures
La liste des limites supérieures ne peut être obtenue, pas ajoutée (pour être précis, elle ne peut rien ajouter d'autre que null ) Objets, y compris Objet)
La liste de limites inférieures ne peut être ajoutée que, mais pas obtenue
import java.util.ArrayList; import java.util.List; class Fruit {} class Apple extends Fruit {} class Jonathan extends Apple {} class Orange extends Fruit {} public class CovariantArrays { public static void main(String[] args) { //上界 List<? extends Fruit> flistTop = new ArrayList<Apple>(); flistTop.add(null); //add Fruit对象会报错 //flist.add(new Fruit()); Fruit fruit1 = flistTop.get(0); //下界 List<? super Apple> flistBottem = new ArrayList<Apple>(); flistBottem.add(new Apple()); flistBottem.add(new Jonathan()); //get Apple对象会报错 //Apple apple = flistBottem.get(0); } }
La raison de ces caractéristiques
Limite supérieure< ;? extend Fruit> , indique toutes les sous-classes qui héritent de Fruit, mais de quelle sous-classe il s'agit ne peut pas être déterminée, donc lors de l'appel de add, personne ne sait quel type ajouter. Mais lors de l'obtention, quelle que soit la sous-classe dont il s'agit, quel que soit le nombre de générations qu'elle remonte, il doit y avoir une classe parent appelée Fruit. Par conséquent, je peux utiliser la plus grande classe parent, Fruit, pour continuer, c'est-à-dire transformer toutes les sous-classes. vers le haut en Fruit.
Limite inférieure super Apple> signifie que toutes les classes parentes d'Apple, y compris Fruit, peuvent être retracées jusqu'à l'objet ancêtre. Ensuite, lorsque j'ajoute, je ne peux pas ajouter la classe parent d'Apple car je ne peux pas déterminer quelle classe parent est stockée dans la liste. Mais je peux ajouter Apple et ses sous-classes. Parce que quel que soit le type de ma sous-classe, elle peut être transformée en Apple et toutes ses classes parentes ou même en Object. Mais quand je l'obtiens, il y a tellement de classes parents d'Apple que dois-je utiliser pour continuer, à part Object, je ne peux rien attraper d'autre.
Donc, en dernière analyse, cela peut être exprimé en une phrase, c'est-à-dire que le compilateur peut prendre en charge la transformation vers le haut, mais pas la transformation vers le bas. Plus précisément, je peux attribuer l'objet Apple à une référence à Fruit, mais si j'attribue l'objet Fruit à une référence à Apple, je dois utiliser cast
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!