Name clash, non override avec des generics

Name clash, non override avec des generics - Java - Programmation

Marsh Posté le 14-02-2012 à 19:00:17    

Salut,
 
J'ai la classe abstraite suivante:
 
abstract Toto, dedans j'ai:
 
   

Code :
  1. public static class Titi<T> {
  2.       private T membre;
  3.       ...
  4.     }
  5.   protected abstract void doIt(Titi<?> titi);


 
 
dans la classe qui étend Toto: TotoX j'ai:
 
 

Code :
  1. @Override
  2.     public void doIt(Toto.Titi<String> titi) {
  3.         ...
  4.     }


 
Le compilateur d'Eclipse me dit ça:
 

Citation :


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 ?

Reply

Marsh Posté le 14-02-2012 à 19:00:17   

Reply

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...

Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed