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

  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.

  7. #7
    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
    je pensais pas exemple que la covariance des type de retours consistaient en cela :

    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
     
     
    interface A
    {
    object get () ;
    }
     
    class X implements A
    {
    String get() ;
    }
     
    class Y implements A
    {
    Integer get() ;
    }
    et ainsi un :

    A test = new X() ;
    test.get() ;

    me retournerai un String

  8. #8
    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 new.proger Voir le message
    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.
    Dans ce cas je ne pense pas que les generics que t en as besoins....
    les generics c est une forme de protection, sachants qu ils seront enleves apres la compilation...
    essaie de faire des test du genre instanceof ... mais c est vraiment lourd ca...
    pour le moment j ai pas d autres idee...
    bonne chance et fais nous savoir ta solution...

  9. #9
    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
    Ben cela fonctionne avec les Generics et le code que tu as fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    interface A<T>
    {
    T get () ;
    }
     
    class X implements A<String>
    {
    String get() ;
    }
     
    class Y implements A<Integer>
    {
    Integer get() ;
    }
    Citation Envoyé par new.proger Voir le message
    A test = new X() ;
    test.get() ;

    me retournerai un String
    test.get() te retournera bien un objet String, mais bien sûr il sera déclaré en tant que Object puisque tu utilises une déclaration non typé.

    Ceci te renverra bien un String :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A<String> test = new X() ;
    test.get() ;
    a++

  10. #10
    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
    Oui adiGuba, je recoit bien bien un String caché derriere un Object, d'ou mon probleme, la structure devant etre vidé automatiquement, je ne sais pas ce qui ressort quand je fait un "get()"

    L'objectif etant de sortir toute les DATA pour prendre leurs valeur que l'on asserais en parametre a la bonne fonction

    fonction (int)
    fonction (string)

    dans le cas present je dois tester toutes les possibilité de types afin de caster le resultat du get pour le transmettre a la bonne fonction.

  11. #11
    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 new.proger Voir le message
    L'objectif etant de sortir toute les DATA pour prendre leurs valeur que l'on asserais en parametre a la bonne fonction
    D'où ma question : a quoi servent ces fonctions ?
    Ne devraient-elles pas faire partie de l'interface A ?

    a++

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Par défaut
    Je pense qu'il y a un problème de design dans ton programme.

    Le fait que tu doives connaitres le type de la données pour pouvoir la caster indiques qu'il y a un pb.

    Pourquoi ne pas faire une interface décrivant toutes les operations que tu peux faire sur les Data et Data serait passé en paramètre à toutes tes fonctions ?

    Ainsi, à la place d'avoir des fonctions:
    fonction (int)
    fonction (string)

    Tu aurais:
    fonction (Data)

  13. #13
    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
    mon probleme n'est pas tant les setters que les getters.

    data.getValue() ne sais pas d'avance le type de data et donc probleme...

    Je vais donc poser le probleme autrement.

    Je possede une interface DATA avec des operations internes et surtout des methodes de GET et SET retournant la valeure interne de la DATA.

    la data peut-etre de type DATE, INTEGER, DOUBLE, STRING, donc une classe pour chaque type car les operations interne ne sont pas commune.

    comment construire une matrice (un tableau a 2 dimensions) dynamiquement (sans connaitre a l'avance les types) avec ces 4 types, de sorte qu'un data.getValue() me retourne un string, date, double ou int en fonction du type reel de la data stocké ?

  14. #14
    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
    Bon apres recherche et reflexion il semblerai que l'on ne puisse pas obtenir par un get.DATA() autre chose que Object et cela quelque soit la methode.

  15. #15
    Membre chevronné

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Par défaut
    Salut,

    Pour ma part je vote pour la proposition de jhaythem en utilisant des cast dans des blocs try, si ton Data ne peut pas être casté en int tu essaie en String et ainsi de suite.

    Mais c'est tout à fait curieux de modéliser une structure de données pour finalement tout lui passer dans un type unique. Ca me semble très dangeureux à plein de niveaux et il faut peut être commencer par repenser cette partie plutot que de mettre en place un système lourd pour "deviner" ce qui a été stocké.

    Peux tu influer sur l'étape d'enregistrement des données? Ca pourrai te permettre d'ajouter un indice au début de chaque enregistrement, genre 1, 2, 3.. qui correspondrai au type initial. Ensuite tu le recupère, tu trouve le type qui faut et tu cast le reste en fonction.

    Bon courage,
    Cordialement,
    Tif

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