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 :

New sur un paramètre générique


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Par défaut New sur un paramètre générique
    Bonjour.

    J'ai un souci que je ne comprends pas. J'essaye de faire un new T dans une classe où T est le paramètre de généricité tel que défini ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Generique<T extends Truc> {
       public void T newInstance() {
          return new T(1);
       }
    }
    Étant entendu que le constructeur Truc(int x) existe, ainsi que pour ses fils. Vu que j'ai spécifié que le paramètre générique devait nécessairement dériver de Truc, je ne vois pas où cela peut poser problème.

    Merci d'avance.

    @+
    Rémi

  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,


    Ce n'est pas possible tel quel car le paramétrage Generics est perdu à la compilation...

    Pour plus d'info : Les Generics ne sont pas des Templates comme les autres !

    a++

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par srvremi Voir le message
    Étant entendu que le constructeur Truc(int x) existe, ainsi que pour ses fils.
    Quelques-uns de ses fils, oui, mais pas tous.
    Pas la peine de contester : je viens de créer la classe ThelvinTruc qui étend Truc. Elle n'a pas de constructeur ThelvinTruc(int x), mais elle satisfait toutes les contraintes de sa classe mère Truc. Elle compile parfaitement et passe tous les unit tests à l'exécution. Cette classe existe donc.

    Conclusion : on ne peut pas garantir les constructeurs qui existent ou non dans une classe fille, et donc, certains fils de Truc n'ont pas le constructeur en question.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    deux solutions pratiquables a mon avis que je puisse te proposer:

    1) en imposant l'existance du constructeur int.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Generique<T extends Truc> {
       private Class<T> type;
       public Generique(Class<T> type){
           this.type=type;
       }
       public T newInstance() {
          try{
             Constructor c = type.getConstructor(Integer.class);
             return c.newInstance(1);
          } catch (NoSuchMethodException e){
             throw new IllegalStateException(type.getName()+" doit avoir un constructeur: new "+type.getName()+" (int)");
          }
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Generique<MachinTruc> generique = new Generique<>(MachinTruc.class);
    generique.newInstance();
    2) en laissant libre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public abstract class Generique<T extends Truc> {
     
       public abstract T newInstance();
       //.....
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //quelque part
    Generique<TheElvinTruc> monGenerique = new Generique<>(){
        public TheElvinTruc newInstance(){return new TheElvinTruc();}
    };
    monGeneric.newInstance();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class MachinGenerique extends Generique<MachinTruc> {
        public MachinTruc newInstance() {
            return new MachinTruc(69);
        }
    }

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/08/2010, 10h00
  2. Réponses: 10
    Dernier message: 04/03/2008, 15h13
  3. Réponses: 3
    Dernier message: 11/01/2006, 14h22
  4. [VB6]Question bête sur les paramètres optionels
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/10/2005, 20h33
  5. est il possible de faire un trie sur un paramètre donné
    Par chtiboss dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/03/2004, 11h51

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