2016-07-19 1 views
1

Quelle est la raison d'une telle affectation? Une fois que nous "upcast" le conteneur Apple dans un conteneur de fruits, nous ne sommes pas en mesure d'ajouter quelque chose dedans.Quelle est l'application pratique d'une affectation impliquant un caractère générique?

Je sais que nous pourrions faire quelque chose comme:

List<Apple> basket = new ArrayList<Apple>(); 
//Fill the basket with tons of juicy apples 
List<? extends Fruit> fruitContainer = basket; 

Et nous pourrions être en mesure d'utiliser l'interface Fruit d'utiliser les éléments détenus par fruitContainer. Mais quelle peut être la raison pratique de faire quelque chose comme ceci, si nous ne pouvons rien ajouter plus tard?

List<? extends Fruit> flist = new ArrayList<Apple>(); 

Répondre

0

Cette ligne a pris tout n'a probablement pas pratique, mais comme vous l'avez dit dans votre question, chacune des parties les de celui-ci (List<? extends Fruit> flist et new ArrayList<Apple>()), séparément, a une pratique utilisation. Ils sont à la fois valides et utiles, mais pas en combinaison (à moins que vous n'ayez besoin de mettre quelque chose dans votre liste). C'est pourquoi il compile, chacune des parties est valide; c'est à nous, les programmeurs, de les combiner de manière raisonnable et utile.

+0

La question est: pourquoi un programmeur devrait-il faire quelque chose comme ça? Pouvez-vous trouver un scénario réaliste? :) – acejazz

+0

@acejazz: Ma première phrase couvre ceci: Je ne pense pas qu'il y ait de raison pratique de le faire (à moins que, comme je le dis plus tard, vous n'ayez besoin d'ajouter quoi que ce soit à la liste). –