Name clash, non override avec des generics - Java - Programmation
Marsh Posté le 15-02-2012 à 09:14:26
J'ai trouve la solution en paramétrant Toto:
avant: public abstract class Toto { et protected abstract void doIt(Titi<?> titi); et public class TotoX extends Toto {
maintenant: public abstract class Toto<U> et protected abstract void doIt(Titi<U> titi); et public class TotoX extends Toto<String> {
ça marche, enfin ça compile en tout cas, mais je comprends toujours pas...
Marsh Posté le 15-02-2012 à 10:51:31
Il y a deux choses à comprendre :
- le type erasure : comme tu l'as dit, ça fait que au niveau bytecode, doIt(Titi<?> ) et doIt(Titi<String> ) ont la même signature
- la signification de la surcharge : quand tu surcharges une méthode (abstraite ou concrète, ça ne change rien), tu dois fournir une méthode qui peut être appelée exactement comme la méthode de base. En particulier, tu ne peux pas mettre des contraintes supplémentaires (par exemple, c'est interdit d'envoyer des checked exceptions qui ne sont pas déclarées dans la méthode de base)
Dans ton cas, la méthode abstraite attend un Titi<?>, et tu cherches à la surcharger avec une méthode qui n'accepte que Titi<String>. C'est une contrainte supplémentaire. Pour s'en convaincre, il suffit de voir que la méthode abstraite peut accepter par exemple un Titi<Integer>, alors que ton implémentation la refusera.
Marsh Posté le 14-02-2012 à 19:00:17
Salut,
J'ai la classe abstraite suivante:
abstract Toto, dedans j'ai:
dans la classe qui étend Toto: TotoX j'ai:
Le compilateur d'Eclipse me dit ça:
Name clash: The method doIt(Toto.Titi<String> ) of type TotoX has the same erasure as doIt(Toto.Titi<?> ) of type Toto but does not override it
D’après ce que j'ai compris l'erasure c'est la suppression par le compilateur des generics, donc ok pour la même signature mais alors pourquoi il dit que ça override pas ?