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 :

Généralisation de méthode <T>


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Généralisation de méthode <T>
    Bonjour,

    J'ai une méthode qui est reprise dans plusieurs classes, la seule chose qui change c'est le type des paramètre. Je voudrait la généraliser mais je me heurte à quelques difficultés. Je ne sais pas si je m'y prends bien.

    Contenu de la méthode non généralisé :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    	public void synchronizeAffectation(Affectation iAffectation, Affectation rAffectation, List<Mouvement> mouvements, boolean simuler) {
    		if( _log.isDebugEnabled() )
    			_log.debug("synchronizeAffectation(affectation=" + iAffectation + ")");
     
    		HiDatabase db = HiReferentiel.get();
    		long cc = db.transactionRequired();
     
    		try {
    			/* Si affectation dans le référentiel non existant : insertion. */
    			if( rAffectation == null ) {				
    				if( _log.isInfoEnabled()) 
    					_log.info("INSERT " + iAffectation);
     
    				// Inserer le nouvel object
    				if( ! simuler )
    					db.getSession().persist(iAffectation);
    				else
    					// FIXME Impossible puisque rAffectation est null
    					//iAffectation.setTechid( rAffectation.getTechid() );
     
    				mouvements.add(new MouvementInsert(iAffectation));
     
                    } catch (RuntimeException e) {
    			db.setRollbackOnly();
    			throw e;
    		} finally {
    			db.transactionEnd(cc);
    		}
    }
    Voila la généralisation que j'ai essayé de faire :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    public abstract class Service<T extends TechIdentifiable> {
     
    	private static final Logger _log = Logger.getLogger(Service.class);
     
    	public void synchronize (Class <T> iObject,Class <T> rObject, List<Mouvement> mouvements, boolean simuler  ) {
    		if( _log.isDebugEnabled() )
    			_log.debug("synchronizeAffectationHisto(affectationHisto=" + iObject + ")");
     
    		HiDatabase db = HiReferentiel.get();
    		long cc = db.transactionRequired();
     
    		try {
    			/* Si affectation dans le référentiel non existant : insertion. */
    			if( rObject == null ) {
    				if( _log.isInfoEnabled()) 
    					_log.info("INSERT " + iObject);
     
    				// Inserer le nouvel object
    				if( ! simuler )
    					db.getSession().persist(iObject);
    				else
    					// FIXME Peut pas marcher : rAffectationHisto est null 
    					//iAffectationHisto.setTechid( rAffectationHisto.getTechid());
     
    				mouvements.add(new MouvementInsert(iObject));
                    } catch (RuntimeException e) {
    			db.setRollbackOnly();
    			throw e;
    		} finally {
    			db.transactionEnd(cc);
    		}
    }
    Le problème est que ma méthode MouvementInsert me présente l'erreur suivante :
    The constructor MouvementInsert(Class<T>) is undefined
    .

    Et il m'est également impossible d'accéder aux méthodes de ma classe <T> (ce qui me parait normal) mais plutot génant dans mon codage....

    Pouvez-vous m'éclairer sur la marche à suivre, une solution autre est-elle préférable ? Merci.

  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,


    Pourquoi utilises-tu Class<T> ??? Cela ne représente pas un "objet de type T" mais le "type T". Ce n'est pas la même chose...

    Il te faut tout simplement utiliser T (si le type des objets générique est bien TechIdentifiable):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public abstract class Service<T extends TechIdentifiable> {
     
        public void synchronize (T iObject,T rObject, List<Mouvement> mouvements, boolean simuler  ) {
            ...
        }
    Et si les Generics ne sont utile que pour cette méthode, tu peux limiter leurs utilisations à cette dernière et non pas à la classe entière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public abstract class Service {
     
        public <T extends TechIdentifiable> void synchronize (T iObject,T rObject, List<Mouvement> mouvements, boolean simuler  ) {
            ...
        }
    a++

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je te remercie pour tes conseils, ta solution fonctionne très bien. Je commence à comprendre comment fonctionne la "généralisation"

    ++

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

Discussions similaires

  1. enum avec attributs et méthodes et généralisation
    Par dummygreg dans le forum Concurrence et multi-thread
    Réponses: 16
    Dernier message: 03/07/2009, 14h49
  2. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 19h10
  3. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 18h10
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 15h26
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 09h22

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