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 :

Classe générique utilisant une autre classe générique


Sujet :

Langage Java

  1. #1
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut Classe générique utilisant une autre classe générique
    Bonjour,

    J'ai un problème étrange à la compilation d'une classe générique utilisant elle-même des génériques, et que je ne m'explique pas. J'ai réduit le problème dans la classe suivante :

    Fichier TestGenerics.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import java.util.List;
    import java.util.ArrayList;
     
    public class TestGenerics<T>  {
     
        public List<String> getList() {
            return new ArrayList<String>();
        }
     
     
        public static void main(String[] args) {
            TestGenerics test = new TestGenerics();
            String string = test.getList().get(0);
        }
    }
    Résultat de la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    > java -version
    java version "1.5.0_06"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
    Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)
     
    > javac TestGenerics.java
    TestGenerics.java:13: incompatible types
    found   : java.lang.Object
    required: java.lang.String
            String string = test.getList().get(0);
                                              ^
    1 error
    Si je supprime le "<T>" de "TestGenerics" pour en faire une classe non paramétrée, je n'ai plus l'erreur.

    Quel est le problème ?

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Bizarre en effet !

    Je suppose que comme tu ne précises pas le type Generics de ta classe, tous les appels de méthode se font sans Generics, même si cela n'a aucun rapport avec le <T>.


    En paramétrant correctement ton instance avec n'importe quel type cela fonctionne parfaitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            TestGenerics<Date> test = new TestGenerics<Date>();
            String string = test.getList().get(0);

    Pour rappel les classes Generics devraient toujours être typé. L'absence de typage n'est possible que par compatibilité avec le code existant...


    D'où ma question : Pourquoi créer une classe Generics si c'est pour ne pas l'utiliser comme tel ?

    a++

  3. #3
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Dans mon code réel je me retrouve à un moment avec une liste d'objets de cette classe avec des types paramétrés différents. A ce moment là du code je n'ai besoin que des méthodes standard, pas des méthodes paramétrées, c'est pour ça que j'utilise le type sans paramètre.

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Dans ce cas tu as deux principaux cas :

    1. Au lieu de créer une instance non-paramétré, tu la paramètres avec le type de base (donc Object dans ton cas) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      TestGenerics<Object> test = new TestGenerics<Object>();
    2. Si tu fait cela pour avoir du code génériques (et donc caster depuis n'importe quel instance paramétré de TestGenerics), il faut plutôt utiliser les wildcards :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      TestGenerics<?> test = uneInstanceDeTestGenericsParametré;
      Ou encore (ce qui est équivalent dans ce cas) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      TestGenerics<? extends Object> test = uneInstanceDeTestGenericsParametré;



    a++

  5. #5
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Effectivement, en utilisant "TestGenerics<?>" je n'ai plus de problème. Par contre je ne vois toujours pas pourquoi ça ne marche pas sans !

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vic Voir le message
    Effectivement, en utilisant "TestGenerics<?>" je n'ai plus de problème. Par contre je ne vois toujours pas pourquoi ça ne marche pas sans !
    Parce que sans paramétrage le compilateur utilise le mode de compatibilité avec les anciennes versions, c'est à dire qu'il ignore tous les paramétrages... y compris ceux fixer en dur dans le code

    a++

Discussions similaires

  1. Utiliser la classe map dans une autre classe
    Par Zaza91280 dans le forum Débuter
    Réponses: 3
    Dernier message: 04/06/2010, 08h34
  2. Réponses: 4
    Dernier message: 24/07/2009, 14h56
  3. Réponses: 7
    Dernier message: 03/12/2008, 15h18
  4. Réponses: 2
    Dernier message: 13/05/2008, 10h02
  5. debutant : classe utilisant une autre classe
    Par zoubla dans le forum Débuter
    Réponses: 6
    Dernier message: 20/10/2006, 15h40

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