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 et retour de type implementé


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de austin P.
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Par défaut generics et retour de type implementé
    slt

    le titre n'est pas très parlant mais je vais tenter d'expliquer le cas

    j'ai une classe A qui utilise un generic et qui propose une methode duplicate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface A {
     
     
    	public <T extends A>T duplicate();
    j'ai une classe B qui implemente A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class B implements A {
     
     
    	public B duplicate() {
     
    		B b = new B();
    		return b;
     
    	}
     
    }
    pourtant j'ai un warn de compile sur "public B duplicate()" car il me dit que
    "Type safety: The return type B for duplicate() from the type B needs unchecked conversion to conform to T from the type A"

    pourtant B est bien de type A par héritage

    comprend pas

    une idée ?

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Oui, cela ne va pas du tout.

    Imagine que tu aies la déclaration suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class C extends A {...}
    ... tu pourrais très bien écrire, avec ta déclaration de duplicate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    B b = new B();
    C c = b.duplicate();
    ... ce qui serait légal à la compilation, mais de façon tout à fait erronée. On peut donc bien dire que la déclaration <T extends A> n'est pas équivalente à la déclaration class B extends A, aussi bizarre que cela puisse paraitre.

    D'une façon générale, le extends d'héritage ne signifie pas la même chose que le extends des génériques, même si la relation qu'il exprime entre les deux parties est la même (ou quasiment la même).

  3. #3
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Il faut utiliser super et non pas extends dans le generic pour symboliser la relation que tu veux.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  4. #4
    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 bulbo Voir le message
    Il faut utiliser super et non pas extends dans le generic pour symboliser la relation que tu veux.
    Non non c'est bien extends !

    En fait si je comprend bien austin P. veut faire référence au type courant. Ici cela ne peut pas marcher car les generics ne s'applique qu'à la méthode et dépendent donc de son appel et non pas du type courant.


    Il s'agit du pattern "SelfType" qui peut être défini comme cela avec les Generics :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    interface A<THIS extends A<THIS>> {
     
    	public THIS duplicate();
     
    }
    Le type THIS représente le type courant, et le extends A<THIS> permet d'être sûr qu'il s'utilise correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class B implements A<B> {
     
    	public B duplicate() {
    		return new B();
    	}
    }
    Par contre il y a un gros défaut c'est que cela ne fonctionne qu'à un seul niveau d'héritage. Un sous-type de B peut très bien déclarer renvoyer un objet de type B et non pas son propre type...



    A noter qu'il y a une RFE sur le sujet : http://bugs.sun.com/bugdatabase/view...bug_id=6479372

    Ce qui permettrait d'utiliser les self-types pour les valeurs de retour :
    [code]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    interface A {
     
    	public this duplicate();
     
    }
    Ce qui obligerait toutes les classes implémentant l'interface à renvoyer leurs propres types...

    Mais rien d'officiel pour le moment...

    a++

  5. #5
    Membre confirmé Avatar de austin P.
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,



    Non non c'est bien extends !

    En fait si je comprend bien austin P. veut faire référence au type courant.
    KORREQ

    Citation Envoyé par adiGuba Voir le message
    Ici cela ne peut pas marcher car les generics ne s'applique qu'à la méthode et dépendent donc de son appel et non pas du type courant.
    et M....

    Citation Envoyé par adiGuba Voir le message
    Par contre il y a un gros défaut c'est que cela ne fonctionne qu'à un seul niveau d'héritage. Un sous-type de B peut très bien déclarer renvoyer un objet de type B et non pas son propre type...
    c'est bien là ou j'en était arrivé après plusieurs tests
    dommage

    Citation Envoyé par adiGuba Voir le message
    Ce qui obligerait toutes les classes implémentant l'interface à renvoyer leurs propres types...

    Mais rien d'officiel pour le moment...
    c'est bien dommage parske réellement utile

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Et j'ajouterais à toutes ces excellentes explications que, en l'état, je ne vois absolument pas à quoi servirait la construction de austin P., même dans l'hypothèse où elle voudrait dire quelque chose et où elle marcherait ?...

  7. #7
    Membre confirmé Avatar de austin P.
    Inscrit en
    Juin 2004
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2004
    Messages : 182
    Par défaut
    Citation Envoyé par bulbo Voir le message
    Il faut utiliser super et non pas extends dans le generic pour symboliser la relation que tu veux.
    euh c'est a dire ?

Discussions similaires

  1. Generics de generics et correspondance de type
    Par kerflyn dans le forum Langage
    Réponses: 3
    Dernier message: 14/12/2009, 17h10
  2. retour du type générique avec réflexion
    Par maxeur dans le forum C#
    Réponses: 2
    Dernier message: 03/07/2009, 14h05
  3. Réponses: 2
    Dernier message: 24/06/2009, 12h30
  4. Webservice avec AXIS , Eclipse et retour de type complexe
    Par Ashen-Shugar dans le forum Services Web
    Réponses: 2
    Dernier message: 26/12/2007, 21h24
  5. Réponses: 1
    Dernier message: 16/03/2007, 11h46

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