5 Réponses :
Parce que les génériques ne sont qu'une aide de temps compilée à vous. Après la compilation, il n'y aura pas de génériques d'informations connexes stockées dans le bytecode. P>
Jetez un coup d'œil à ceci: p>
http://docs.oracle.com/javase/tatutorial/ Java / Generics / Erasure.html P>
C'est faux. Les types ne sont effacés que du type générique lui-même; Les classes qui utilisent des types génériques (comme champs, types de retour ou de paramètre, super-types, etc.) sont pleines d'informations de type générique et peuvent être inspectées au moment de l'exécution de l'API de réflexion.
C'est à quel point le système de type de Java "fonctionne". Les génériques LISTE LISTE list list code> si vous voulez), et Les deux types sont vraiment identiques, sans différences internes. Par conséquent, vous ne pouvez pas réellement surcharge em> sur différents paramètres de génériques, car en ce qui concerne la résolution de la surcharge, les deux types sont identiques. P>
Après l'effacement de type, les deux méthodes auront une signature de Vous devez renommer les méthodes ou passer un autre argument comme la classe des valeurs de la liste. P> Void privé ajouter (liste) code>, qui n'est pas autorisé. P>
En plus des réponses d'Adarshr et de Kerrek, pourquoi ne pas simplement le rendre générique comme ci-dessous: qui devrait fonctionner pour les deux cas ... p> p> p>
Cette limitation fait partie de la syntaxe de la langue, pas du temps d'exécution Java lui-même. Essentiellement, cette règle est destinée à éviter les conflits dans le code hérité qui utilise toujours des types bruts.
Un compilateur comme Voici une illustration de la raison pour laquelle cela n'était pas autorisé, tiré de la JLS. Supposons, avant que des génériques n'a été introduite à Java, j'ai écrit un code comme celui-ci: p> Vous étendez ma classe, comme ceci: p> après l'introduction de génériques, j'ai décidé de mettre à jour ma bibliothèque. p> Vous n'êtes pas prêt à faire des mises à jour , alors vous laissez votre code> classe code> seul. Afin de remplacer correctement la méthode Maintenant, le temps passe et vous décidez que vous êtes prêt à mettre à jour votre classe. Mais vous bousez un peu, et au lieu d'éditer la méthode Tolist Javac code> rejetera ce type de surcharge, mais si vous créez une classe par d'autres moyens (écrire Votre propre compilateur ou à l'aide d'une bibliothèque d'ingénierie de code d'octet comme ASM) avec des signatures qui ne diffèrent que par type de paramètres de type, le compilateur Javac code> résoudre les appels appelle la méthode correcte dans votre classe. P> tolist () CODE>, les concepteurs de langue ont décidé qu'un type brut était "remplacement équivalent" à tout type généalifié. Cela signifie que bien que votre signature de méthode ne soit plus officiellement égale à la signature de ma superclasse, votre méthode remplit toujours. P> Tolist Tolist () Code>, vous ajoutez em> une nouvelle méthode comme celle-ci: p> class Overrider extends CollectionConverter {
@Override
List toList(Collection c) {...}
@Override
<T> List<T> toList(Collection<T> c) {...}
}
Ceci est intéressant (après tout, la résolution surcharge est effectuée par le compilateur), donc je me demande si la spécification de langue Java a quelque chose à dire sur cette question. Serait-il conforme à un compilateur de faire cela, ou la spécification exige-t-elle réellement que les deux types paramétré doivent être traités comme les mêmes?
@Kerreksb il a beaucoup à dire sur la question. Découvrez JLS § 8.4.2 A >
Cette question a déjà été répondue: Stackoverflow.com/questions/1998544/...
Intéressant, merci pour l'info.
Maintenant, cette question a réponse correcte aussi.
Faire la méthode générique