IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Problemes avec les génériques


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut Problemes avec les génériques
    Salut, je n'arrive pas à voir pourquoi je n'obtiens pas une référence sur le bon type avec le code suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public abstract class DimensionType{
      public static String info(){ return "abstractType"; }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class DimensionInt extends DimensionType{
      public static String info(){ return "Int Type"; }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public abstract class Dimension <T extends DimensionType>{
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class DimensionValues <T extends DimensionType> extends Dimension<T>{
      public DimensionValues(){
        System.out.println(T.info() + "");
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Dumb { 
      public static void main(String [] args){
        DimensionValues<DimensionInt> d = new DimensionValues<DimensionInt>();
      } 
    }
    Et là, je m'attends à obtenir "Int Type" mais j'obtiens "Abstract Type".
    Arghhh ! Une petite idée ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    L'héritage ça ne marche pas avec les méthodes statiques (et ça n'a rien à voir avec les génériques). Les méthodes statiques d'une classe fille ne surchargent pas les méthodes statiques de la classe mère.

  3. #3
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    l'idée c'était de pouvoir faire un truc du genre dans la classe DimensionValues :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T t = T.getValue(s);
    Forcément, si je ne peux pas surcharger une fonction statique, je suis out pour étendre une fabrique.

    La solution est donc de passer la référence vers la classe du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new DimensionValues<TypeInt>(TypeInt.class));
    ce qui permet ensuite de créer une instance du type.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Effectivement dans les génériques, le type paramétré (<T>) est effacé à la compilation, donc le seul moyen de connaître ce fameux T est d'avoir l'objet Class associé

  5. #5
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut
    Citation Envoyé par lefait
    (...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public abstract class Dimension <T extends DimensionType>{
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class DimensionValues <T extends DimensionType> extends Dimension<T>{
      public DimensionValues(){
        System.out.println(T.info() + "");
      }
    }
    (...)

    Et là, je m'attends à obtenir "Int Type" mais j'obtiens "Abstract Type".
    Arghhh ! Une petite idée ?
    Essentiellement parlant des Generics en Java, il existe deux types d'identificateurs: "?" "Object" séparés par des virgules. Ainsi pour la classe Dimension que tu désires génériser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public abstract class Dimension <? extends DimensionType>{
    }
    La classe "T" n'existe en réalité que dans les définitions de Sun, elles impliquent la définition de cette classe T en une classe générique, jette un oeil aux sources et tu pourras vérifier cette affirmation.
    voilà

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par broumbroum
    Essentiellement parlant des Generics en Java, il existe deux types d'identificateurs: "?" "Object" séparés par des virgules. Ainsi pour la classe Dimension que tu désires génériser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public abstract class Dimension <? extends DimensionType>{
    }
    Le type wilcard ("?") ne peut pas être utilisé dans ce contexte (déclaration de type paramétré) mais seulement lors de l'utilisation du type (paramètre de méthode, variable, etc.).

    Ici le problème a bien été ciblé par the-gtm :
    Citation Envoyé par the-gtm
    L'héritage ça ne marche pas avec les méthodes statiques
    Citation Envoyé par broumbroum
    La classe "T" n'existe en réalité que dans les définitions de Sun, elles impliquent la définition de cette classe T en une classe générique, jette un oeil aux sources et tu pourras vérifier cette affirmation.
    voilà
    Que veux-tu dire par là ?
    La classe T (ou tout autre nom utilisé par les Generics) n'existe pas, c'est juste un alias utilisé par le compilateur pour vérifier la cohérence des type...

    a++

  7. #7
    Membre chevronné Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Par défaut
    "T" peut-etre utilisée comme une classe habituelle, ce que je veux dire par définition, la générisation telle que je la lis dans le manuel, s'effectue à 2 niveaux, celui des classes et des variables. cela n'a rien à voir avec les modificateurs "static" ou autres. d'ailleurs je ne suis pas très sûr, une classe static pourrait indiquer sa généricité, non?

    Ce n'est pas ce qui était demandé au début, il est présenté le code avec une classe abstraite et une définition générique.
    En réalité je ne fais que reproduire ce que j'ai pu lire dans le manuel que je peux citer ici: "Aide-mémoire Java", livret que je consulte souvent.

  8. #8
    Membre averti
    Inscrit en
    Avril 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 13
    Par défaut
    effectivement, mon problème était que je ne me rapellais plus qu'on ne pouvait pas spécialiser une méthode statique. Si cela avait été possible, cela m'aurait évité d'avoir à écrire une fabrique externe.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  2. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  3. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32
  4. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 22h50
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo