77 votes

Generics-Get et Put règle

J'ai lu O'Reilly livre, que j'ai connu ce OBTENIR et de METTRE à la règle

Utiliser un s'étend générique quand vous n'avez que des valeurs d'une structure, d'utiliser un super générique quand vous avez seulement mettre des valeurs dans une structure, et ne pas utiliser un caractère générique à la fois lorsque vous get et put.

les exceptions sont les suivantes:

  • Vous ne pouvez pas mettre n'importe quoi dans un type déclaré avec une s'ÉTEND générique, sauf pour la valeur null, ce qui appartient à chaque type de référence

  • vous ne pouvez pas obtenir quoi que ce soit à partir d'un type déclaré avec un SUPER générique, sauf pour une valeur du type de l'Objet, qui est un super-type de chaque type de référence

Quelqu'un peut-il m'aider à explorer cette règle en profondeur? Si possible,veuillez les mettre en ordre hiérarchique.

156voto

Jon Skeet Points 692016

Envisager un régime de bananes. C'est un Collection<? extends Fruit> qu'il s'agit d'une collection d'un type particulier de fruits, mais vous ne savez pas (à partir de cette déclaration) quel genre de fruit c'est une collection de. Vous pouvez obtenir un élément de celui-ci et de savoir qu'il va certainement être un fruit, mais vous ne pouvez pas ajouter de il - vous tentez peut-être d'ajouter une pomme à un régime de bananes, ce qui serait certainement erroné. Vous pouvez ajouter null , qui sera une valeur valide pour tout type de fruits.

Considérons maintenant un fruitbowl. C'est un Collection<? super Banana>, en ce que c'est une collection de type "plus grand que" Banana (par exemple, Collection<Fruit> ou Collection<TropicalFruit>). Vous pouvez certainement ajouter une banane pour cela, mais si vous chercher un élément dans le bol que vous ne savez pas ce que vous obtenez - il se pourrait bien ne pas être une banane. Tout ce que vous savez pour certain, c'est qu'il est valide (éventuellement nulle) Object de référence.

(En général, pour Java génériques questions, la Java des Génériques FAQ est une excellente ressource qui contient la réponse à presque tout les génériques liés, vous êtes susceptible de jeter à elle.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X