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 :

[Generic] Interface et classe abstraite générique : implémentation et utilisation


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut [Generic] Interface et classe abstraite générique : implémentation et utilisation
    Bonjour,

    J'ai une interface générique et une classe abstraite qui implémente cette interface, voilà ce que cela donne :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface IGeneric<T extends AbstractObject> {
    	void add(T objet);
    }

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public abstract class AbstractGeneric<T extends AbstractObject> implements IGeneric<T> {
    	public T getById(Long id) {
    		T result = null;
    		PersistenceManager pm = ConnexionUtil.get();
    		result = pm.getObjectById(T.class, id);
    		return result;
    	}
    }

    Question 1 : Pourquoi, dans la déclaration de la classe abstraite, on est obligé de re-préciser que T doit hériter de AbstractObject alors que IGeneric le "dit" déjà ?

    Question 2 : La ligne où je fais le T.class me génère une erreur de compilation, mais je ne vois pas par quoi remplacer. J'ai essayé result.getClass() mais du coup je suis obligée de faire un cast sur le retour (autrement dit, ça ne sert à rien de passer la classe en paramètre). Une idée ?

  2. #2
    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 BiM

    Citation Envoyé par BiM Voir le message
    Question 1 : Pourquoi, dans la déclaration de la classe abstraite, on est obligé de re-préciser que T doit hériter de AbstractObject alors que IGeneric le "dit" déjà ?
    Parce que tu n'es pas obligé de conserver le même type, que tu peux donc modifier le typeage Generics (à partir du moment où il reste compatible) ou encore tu peux le fixer à un type précis.


    Par exemple avec une classe MyObject étendant AbstractObject, tu pourrais faire ceci pour limiter encore plus le type T :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abstract class AbstractGeneric1<T extends MyObject> implements IGeneric<T> { }

    Tu peux fixer le type Generics (ainsi ta classe n'est plus Generics et possèdera directement les méthodes du bon type) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abstract class AbstractGeneric2 implements IGeneric<MyObject> { }

    Tu peux même modifier profondément le paramétrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abstract class AbstractGeneric3<X, Y extends AbstractObject> implements IGeneric<Y> { }


    Bref, c'est un peu verbeux, mais cela permet plusieurs choses




    Citation Envoyé par BiM Voir le message
    Question 2 : La ligne où je fais le T.class me génère une erreur de compilation, mais je ne vois pas par quoi remplacer. J'ai essayé result.getClass() mais du coup je suis obligée de faire un cast sur le retour (autrement dit, ça ne sert à rien de passer la classe en paramètre). Une idée ?
    Si tu es habitué aux Templates du C++ cela peut paraitre étrange... mais en fait les Generics de Java ont pris une option différente afin de préserver la compatibilité et d'éviter la duplication du bytecode.

    Cela entraine quelques limitations dont T.class et new T().
    (pour plus de précision là dessus, je te renvoi vers mon blog : Les Generics ne sont pas des Templates comme les autres !)



    En fait lorsqu'on écrit une classe Generics, il faut penser que le compilateur ne possède pas plus d'information que ce qu'il n'y a dans le code de la classe (et non pas lors de son utilisation).

    Dans ton code, il ne connait pas le type précis de T, et il ne peut donc pas récupérer son class...


    La solution est malheureusement de se trimballer le Class<T>, généralement en le passant au constructeur :
    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
    16
    public abstract class AbstractGeneric<T extends AbstractObject> implements IGeneric<T> {
     
    	private final Class<T> classT;
     
    	public AbstractGeneric(Class<T> t) {
    		if (t==null) throw new NullPointerException("Class<T> is null");
    		this.classT = t;
    	}
     
    	public T getById(Long id) {
    		T result = null;
    		PersistenceManager pm = ConnexionUtil.get();
    		result = pm.getObjectById(classT, id);
    		return result;
    	}
    }

    a++

  3. #3
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Merdi adiGuba !!

    Je ne suis pas du tout habituée au C++ mais je n'étais jamais allée aussi loin dans l'utilisation des Generics. En tout cas, ta solution me convient parfaitement !

    Ok pour ta réponse à la question 1, mais j'ai quand même du mal à saisir pourquoi car quand on va faire :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public interface MonInterface<T extends MonObjetAbstrait> { ... }
    public class MaClasse<T, U> implements MonInterface<T> { ... }

    Le T est le même pour MonInterface et MaClasse, donc je ne vois pas pourquoi il faudrait redéclarer l'héritage puisqu'il est déjà déclaré.

  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
    Citation Envoyé par BiM Voir le message
    Le T est le même pour MonInterface et MaClasse, donc je ne vois pas pourquoi il faudrait redéclarer l'héritage puisqu'il est déjà déclaré.
    C'est vrai que c'est un peu verbeux...

    Je pense qu'il doit y avoir une raison un peu obscur à cela, mais là comme ca je ne pourrais pas te dire

    a++

  5. #5
    BiM
    BiM est déconnecté
    Expert confirmé
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Par défaut
    Merci pour ton aide en tout cas !

    La question 1 était surtout une question de curiosité
    La question 2 était une vraie question pratique.

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

Discussions similaires

  1. différence entre interface et classe abstraite
    Par yacin87 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 29/03/2010, 11h36
  2. Generics, Comparable et classes abstraites
    Par Bowbaq dans le forum Langage
    Réponses: 2
    Dernier message: 27/03/2010, 01h48
  3. Interface ou classe abstraite ?
    Par cobolfingaz dans le forum C#
    Réponses: 6
    Dernier message: 15/07/2008, 17h21
  4. [POO] Différence entre Interface et classe Abstraite
    Par viviboss dans le forum Langage
    Réponses: 7
    Dernier message: 29/11/2006, 16h39
  5. Interface ou classe abstraite ?
    Par Premium dans le forum Langage
    Réponses: 8
    Dernier message: 21/02/2006, 10h23

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