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 :

template et polymorphisme


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Par défaut template et polymorphisme
    Bonjour,

    Je souhaites utiliser une même fonction avec plusieurs types differents.
    Prenons l'exemple d'une fonction affichant le type du paramtre.
    J'ai donc fait 2 fonctions avec des types differents INTEGER et STRING
    mais je n'arrive pas a choisir dynamiquement le bon type, j'ai des erreurs de compilations.
    Voici un 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    interface A <E>
    {
    	public E getVal () ;
    	public void setVal(E e);
    }
     
    class W <String> implements A
    {
    	Object w ;
    W () {//fonction speciale de creation de String}
    	public Object getVal() {
    		return w;
    	}
    	public void setVal(Object e) {
    		w = e ;
    	}
    }
     
    class X <Integer> implements A
    {
    	Integer x ;
    X () {//fonction speciale de creation de Integer}
    	public Integer getVal() {
    		return x;
    	}
    	public void setVal(Object e) {
    		x = (Integer)e ;
    	}
    }
     
    public class TestMain 
    {
     
    	public static void main(String[] args) 
    	{
     
    		A<?> w = new W<String> () ;
    		w.setVal("string") ;
    		kesako(w.getVal()) ;
     
    		A x = new X () ;
    		x.setVal(2);
    		kesako(x.getVal()) ;
     
    	}
     
    	static void kesako (String s)
    	{
    		System.out.println("STRING");
    	}
     
    	static void kesako (Integer s)
    	{
    		System.out.println("INTEGER");
    	}
     
    }

  2. #2
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    il faudra relire le concept des generics .
    t as pas besoin de passer par une interface tu utilise les generics dans ton cas:
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class A<T>{
        public T tonElement;
         public T getVal(){
            return tonElement;
          }
         public void setVal(T element){
              this.tonElement = element;
          }
    }
    voila voili et tu peux construire des A<String> A<int> ou A<Machin>

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Par défaut
    non justement,
    le but est d'avoir une interface parametré, mais des classes concretes qui utilise dans leurs constructeurs une methode qui leurs est propre, le type Int a besoin d'une methode getInt() et le type String d'une methode getString

    Je viens de remettre a jour le code, mais ca marche toujours pas.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
     
     
    import java.util.Vector;
     
     
     
    interface A<a>
    {
    	public a getVal () ;
    	public void setVal(a e);
     
    }
     
    class S implements A<String>
    {
    	String s ;
    	public S () 
    	{
    		// PROPRE A STRING
    	}
    	public String getVal() {
    		return s;
    	}
    	public void setVal(String e) {
    		s = (String)e ;
    	}
    }
     
    class I implements A<Integer>
    {
    	Integer i ;
    	public I () 
    	{
    		// PROPRE A INTEGER
    	}
    	public Integer getVal() {
    		return i;
    	}
    	public void setVal(Integer e) {
    		i = (Integer)e ;
    	}
    }
     
    public class TestMain 
    {
     
    	public static void main(String[] args) 
    	{
    		Vector<A> a = new Vector<A> () ;
    		a.add(new S()) ;
    		a.add(new I()) ;
     
    		for (int i=0 ; i<a.size() ; i++)
    			kesako(a.elementAt(i)) ;
     
    	}
     
    	static void kesako (String s)
    	{
    		System.out.println("STRING");
    	}
     
    	static void kesako (Integer s)
    	{
    		System.out.println("INTEGER");
    	}
     
    }

  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,


    C'est normal que cela ne fonctionne pas, puisqu'à la compilation tu ne connais pas le type paramétré de A. Le compilateur ne peut donc pas décider de la méthode qu'il doit appeler...

    Quel est le besoin réel de tout cela ? Il y a surement une autre approche du problème.

    a++

  5. #5
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    C'est normal que cela ne fonctionne pas, puisqu'à la compilation tu ne connais pas le type paramétré de A. Le compilateur ne peut donc pas décider de la méthode qu'il doit appeler...

    Quel est le besoin réel de tout cela ? Il y a surement une autre approche du problème.

    a++
    ouai explique nous ce que tu veux faire, je ne comprends pas ta vision et surtout je ne comprends pas ton code...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Par défaut
    Alors voila mon probleme,
    je possede une structure de donné contenant des types DATA.

    DATA est une interface avec des methode de Getters et de Setters (entre autres) permettant d'obtenir la valeur de la DATA ou de la modofié.

    Pour remplir la structure on utilise des type concrets implementant DATA tel que Entier, Flottant, Chaine, Date, ...

    Chacun de ces types possedent une representation interne qui lui est propre avec des calculs pour les Entier et Flottant, concatenation pour les chaines et autre comptage de temps pour les dates.

    Pour les SETTERS cela pas de problemes, il suffit de caster une fois pour toutes de Objet en int, double, date, String, ..., suivant le Type de DATA, mais pour les GETTERS c'est plus compliqué.

    Au depart je pensais utiliser la covariance des types de retour mais rien a faire, je recoit toujours des Object.
    Lorsque je fait sur ma structure de donées, getData, il me retourne un DATA qui est concretement un des types cité plus haut, mais comment obtenir la valeur typé de cette DATA sachant que la structure est remplit dynamiquement et que je ne connais donc pas le type reel de l'objet.

Discussions similaires

  1. probleme template et polymorphisme
    Par thenewby dans le forum Langage
    Réponses: 9
    Dernier message: 16/07/2012, 16h48
  2. templates et polymorphisme
    Par mister3957 dans le forum C++
    Réponses: 9
    Dernier message: 01/04/2009, 16h59
  3. Template et Polymorphisme = contrainte ?
    Par poukill dans le forum Langage
    Réponses: 29
    Dernier message: 06/02/2008, 20h27
  4. Template et polymorphisme
    Par fabienpot dans le forum Langage
    Réponses: 9
    Dernier message: 07/09/2006, 16h32
  5. Template et polymorphisme
    Par Pierre_IPROS dans le forum Langage
    Réponses: 19
    Dernier message: 09/10/2005, 23h04

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