Est une Liste<Chien> une sous-classe de la Liste<Animal>? Pourquoi Java génériques pas implicitement polymorphe?

Je suis un peu confus sur la façon de Java génériques l'héritage de la poignée /le polymorphisme.

Assumer la hiérarchie suivante -

Animal (Parent)

Chien - Chat (Enfants)

Supposons donc que j'ai une méthode doSomething(List<Animal> animals). Toutes les règles d'héritage et de polymorphisme, je suppose qu'un List<Dog> est un List<Animal> et un List<Cat> est un List<Animal> - et donc, soit l'un pourrait être transmis à cette méthode. De ne pas faire. Si je veux obtenir ce comportement, je dois indiquer explicitement la méthode d'accepter une liste de toute sous-classe de l'Animal en disant doSomething(List<? extends Animal> animals).

Je comprends que c'est de Java comportement. Ma question est pourquoi? Pourquoi est-polymorphisme généralement implicite, mais quand il s'agit de génériques, il doit être spécifié?

Et totalement sans rapport avec la grammaire question qui me tracasse maintenant - mon titre: "pourquoi ne sont pas Java génériques" ou "pourquoi n'est pas Java génériques"?? Est "génériques" au pluriel parce que du s ou du singulier parce que c'est une entité?
les génériques comme cela se fait en Java sont une mauvaise forme de polymorphisme paramétrique. Ne mettez pas trop dans la foi en eux (comme je le faisais), parce qu'un jour vous serez frappé dur de leur pathétique limitations: le Chirurgien s'étend que ça reste soutenable<Scalpel>, que ça reste soutenable<Éponge> KABOOM! N' pas calculer [TM]. Il y a votre Java génériques de prescription. Tout OOA/OOD peut être traduit amende en Java (et MI peut être fait très bien à l'aide d'interfaces Java) mais les génériques il suffit de ne pas le couper. Ils vont bien pour les "collections" et programmation procédurale qui a dit (qui est ce que la plupart des programmeurs Java faire de toute façon...).
Super classe de Liste<Chien> n'est pas une Liste<Animal> mais<?> (j'.e liste de type inconnu) . Les génériques efface les informations de type dans le code compilé. Ceci est fait de sorte que le code qui est l'utilisation de génériques(java 5 & ci-dessus) est compatible avec les versions antérieures de java sans les génériques.
SI la question - qui est l'utilisation de dire <? s'étend SomeObject> au lieu de <SomeObject>
puisque personne ne semblait réagir... il devrait certainement être "pourquoi ne sont pas les generics de Java...". L'autre problème est que "générique" est en fait un adjectif, et ainsi de "génériques" se réfère à la perte de la nom pluriel modifié par "générique". Vous pourriez dire "que la fonction est un générique", mais qui serait plus difficile que de dire "que la fonction est générique". Cependant, il est un peu lourd à-dire "en Java générique de fonctions et de classes", au lieu de simplement "Java a les génériques". Comme quelqu'un qui a écrit leur thèse de maîtrise sur les adjectifs, je pense que vous avez trébuché sur une question très intéressante!

OriginalL'auteur froadie | 2010-04-30