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 :

Generics Comparable <T>


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 200
    Points : 67
    Points
    67
    Par défaut Generics Comparable <T>
    Bonjour,

    J'aimerais comprendre la syntaxe ci-dessous:

    public <T extends Serializable & Comparable<T>> void method(T data)
    C'est un exemple que j'ai chopé dans la FAQ java.

    En fait voici mes interrogations:

    1- Pourquoi "T" et pas "S" par exemple.
    2- Pourquoi Comparable<T> et pas Comparable.

    Je suis preneur de toute explication.

  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,

    Citation Envoyé par mafanta Voir le message
    1- Pourquoi "T" et pas "S" par exemple.
    Par convention les types Generics utilisent une seule et unique lettre en majuscule. Cela permet de les distinguer des autres types...

    Après S, T, U ou une autre lettre cela n'a aucune importance et ca reste au choix du développeur. Les plus souvent utilisés sont T (pour Type), E (pour Element) K (pour Key), ou V (pour Value)...


    Citation Envoyé par mafanta Voir le message
    2- Pourquoi Comparable<T> et pas Comparable.
    Ben le second n'utilise pas les Generics et n'est donc pas typé...


    a++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 200
    Points : 67
    Points
    67
    Par défaut
    Ben le second n'utilise pas les Generics et n'est donc pas typé
    Oui mais je ne comprends pas la syntaxe entierement c'est à dire:

    public <T extends Serializable & Comparable<T>> void method(T data)
    Par contre je comprends un peu plus la syntaxe suivante:

    public <T extends Serializable & Comparable> void method(T data)

  4. #4
    Membre régulier Avatar de +Guilhem
    Profil pro
    Ingénieur d'études Java/JEE
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur d'études Java/JEE

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Points : 112
    Points
    112
    Par défaut
    Tout dépend du contexte, de la problématique à laquelle tu es confrontée...
    Mais depuis l'introduction des generics (Java 5), il est conseillé de typer les classes génériques, même si cela n'est pas obligatoire. A la limite tu peux utiliser les wildcards (Comparable<?>).

    En quoi tu comprends plus la signature avec Comparable plutôt que Comparable<T> ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 200
    Points : 67
    Points
    67
    Par défaut
    En gros ce que je ne comprends pas c'est public:
    <T extends Serializable & Comparable<T>> void method(T data)
    Pour moi ca veut dire que method est une méthode qui prends en argument T qui étends la classe Serializable et Comparable (est-ce bien ca?).

    Si oui, je ne comprends alors pas pour quoi "<T>" apres Comparable.

    Merci pour vos explications.

  6. #6
    Membre régulier Avatar de +Guilhem
    Profil pro
    Ingénieur d'études Java/JEE
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur d'études Java/JEE

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Points : 112
    Points
    112
    Par défaut
    Citation Envoyé par mafanta Voir le message
    Pour moi ca veut dire que method est une méthode qui prends en argument T qui étends la classe Serializable et Comparable (est-ce bien ca?).
    Oui (ou plutôt en l'occurrence implémente).

    Citation Envoyé par mafanta Voir le message
    Si oui, je ne comprends alors pas pour quoi "<T>" apres Comparable.
    Cela veut simplement dire que "un objet de type T est comparable à un objet de type T". Rien de plus.
    Si on avait pas indiqué le <T>, cela aurait voulu dire que "un objet de type T est comparable à un objet de type quelconque".

    Avec <T> on limite simplement le champ d'action en spécifiant explicitement le type concerné.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 190
    Points : 153
    Points
    153
    Par défaut
    La question semble porter sur la sémantique de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T implements Comparable<T>
    Est-ce bien cela le problème? Crains-tu que cette déclaration soit récursive et donc infini?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 200
    Points : 67
    Points
    67
    Par défaut
    La question semble porter sur la sémantique de: T implements Comparable<T>
    Oui.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 200
    Points : 67
    Points
    67
    Par défaut
    La question semble porter sur la sémantique de:
    T implements Comparable<T>
    Est-ce bien cela le problème? Crains-tu que cette déclaration soit récursive et donc infini?
    Oui exact.

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Eh bien, elle n'est pas récursive. Pas plus que ne l'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a = 1;
    a = a + 2;
    En gros, le type variable T est déclaré, indique ses contraintes, puis, sa définition permettant son utilisation, il est utilisé pour ajuster ces même contraintes.

    T désigne donc n'importe quel type qui soit un Comparable de lui-même.

    Ça a l'air évident : les implémentations de Comparable sont forcément Comparables à elles-mêmes, et pas à des moineaux. En réalité, quand on commence à jouer avec l'héritage, on saisait un peu mieux ce que ça veut dire.
    Bref, ce T extends Machin<T> indique juste que le type variable utilisé doit se traiter lui-même. Normal pour tout ce qui est Comparable.

    Exemple : Integer implémente Comparable<Integer> : ça marche, il est accepte comme T.

    Boolean n'implémente pas Comparable : il n'est pas acceptable comme T.

    La classe ci-dessous implémente Comparable<Integer>, mais elle n'est pas elle-même acceptable comme Integer : elle n'est donc pas acceptable comme T.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Bizarre implements Comparable<Integer> {
      public int compareTo(Integer i) {
        return 0;
      }
    }
    Et en fait, elle est complètement inutilisable pour de nombreuses raisons.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Generics, Comparable et classes abstraites
    Par Bowbaq dans le forum Langage
    Réponses: 2
    Dernier message: 27/03/2010, 01h48
  2. Generics et Comparator
    Par benwit dans le forum Langage
    Réponses: 7
    Dernier message: 17/06/2008, 19h04
  3. [LG][FAQ]comparer des fichiers
    Par lucke dans le forum Langage
    Réponses: 11
    Dernier message: 01/06/2003, 18h02
  4. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  5. Comparer des fichiers de données : Quel Langage ?
    Par Anonymous dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 24/04/2002, 22h37

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