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 :

Instantiation d'un type générique


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut Instantiation d'un type générique
    Bonjour,
    j'aimerais faire quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class C<T> {
      T makeT() {
        return new T();
      }
    }
    mais ça n'est pas possible directement. Existe-t-il un moyen de contourner ce problème ? par reflection ?
    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,


    Tu es obligé de te trimballer le type associé à chaque instance, par exemple :
    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
    class C<T> {
    	private final Class<T> type;
     
    	public C(Class<T> type) {
    		this.type = type;
    		if (type==null) throw new NullPointerException("type is null");
    	}
     
    	T makeT() {
    		try {
    			return this.type.newInstance();
    		} catch (Exception e) {
    			throw new UnsupportedOperationException("Cannot create instance", e);
    		}
    	}
    }
    Que tu utilises comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C<Integer> = new C<Integer>(Integer.class);


    Tu pourrais éventuellement utiliser une méthode statique pour l'instanciation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public static <E> C<E> forType(Class<E> type) {
    		return new C<E>(type);
    	}
    Cela te permet d'éviter les doublons de déclaration des types :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C<Integer> = C.forType(Integer.class);


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

    a++

  3. #3
    Membre expérimenté Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par défaut
    Ah génial merci pour la solution
    Et puis merci aussi pour le document, je quelque chose du type parce que je viens du C++

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

Discussions similaires

  1. [2.0] polymorphisme avec des types générique
    Par mister3957 dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 31/05/2007, 08h11
  2. Type générique paramétré ?
    Par Lebbihi dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2007, 09h58
  3. [Framework] IOC - Type générique
    Par seawolfm dans le forum Spring
    Réponses: 1
    Dernier message: 06/02/2007, 18h17
  4. Réponses: 12
    Dernier message: 23/09/2006, 12h12
  5. y a-t-il un support de types génériques pour python ?
    Par silverhawk.os dans le forum Général Python
    Réponses: 15
    Dernier message: 24/03/2006, 18h23

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