Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4845 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Name clash, non override avec des generics

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Name clash, non override avec des generics

n°2126534
cimourdain
Posté le 14-02-2012 à 19:00:17  profilanswer
 

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 ?

mood
Publicité
Posté le 14-02-2012 à 19:00:17  profilanswer
 

n°2126586
cimourdain
Posté le 15-02-2012 à 09:14:26  profilanswer
 

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

n°2126619
Riokmij
Blink and you're dead
Posté le 15-02-2012 à 10:51:31  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Name clash, non override avec des generics

 

Sujets relatifs
[Javascript] Override objet top' ' does not name a type
delegate + string name methodFormule correcte, mais ecrite de #name? dans la cellule
JSP/JSTL servlet-name[AS3] Recupérer une Array via son .name ou .id
Débutant cherche réponse sur www et domaine name[VB] Font.name et Font.Size en ReadOnly
Struts: recuperer "action name" a parti de l'"action path"Java5 - problème generics
Plus de sujets relatifs à : Name clash, non override avec des generics


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)