Question en généricité en java
Fermé
birdsfly
Messages postés
240
Date d'inscription
mercredi 20 mai 2009
Statut
Membre
Dernière intervention
11 octobre 2013
-
6 janv. 2011 à 12:30
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 8 janv. 2011 à 13:49
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 8 janv. 2011 à 13:49
A voir également:
- Question en généricité en java
- Waptrick java football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Jeux java itel football - Télécharger - Jeux vidéo
- Scanf en java ✓ - Forum Java
- Java jre - Télécharger - Langages
5 réponses
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
8 janv. 2011 à 13:49
8 janv. 2011 à 13:49
Si B extends E, et E extends A, alors B extends A et ton E ne sers plus à rien !
De plus, as-tu testé ta méthode ? Moi oui, et elle ne marche pas...
De plus, as-tu testé ta méthode ? Moi oui, et elle ne marche pas...
public static void main(String args[]) { Object o = new Object(); // Object => A Number n = null; // Number extends Object => E Integer i = 3; // Integer extends Number => B System.out.println(o.toString()); // java.lang.Object@... affecter(o,i); System.out.println(o.toString()); // devrait afficher 3 mais non o=i; System.out.println(o.toString()); // 3 }
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
Modifié par KX le 6/01/2011 à 16:15
Modifié par KX le 6/01/2011 à 16:15
Qu'est-ce que c'est E ?
Imaginons que tu aies class A, et une class B extends A
Tu peux directement faire : B b; A a = b;
Exemple :
En gros ta méthode d'affectation doit juste remplacer le =
La confiance n'exclut pas le contrôle
Imaginons que tu aies class A, et une class B extends A
Tu peux directement faire : B b; A a = b;
Exemple :
public static void main(String[] args) { Integer i = 3; // Integer extends Number Number n = i; System.out.println(n.intValue()); }
En gros ta méthode d'affectation doit juste remplacer le =
public static E affecter(E e) { return e; } public static void main(String[] args) { F f = ... // F extends E E e = affecter(f); // équivalent à f = e; }
La confiance n'exclut pas le contrôle
birdsfly
Messages postés
240
Date d'inscription
mercredi 20 mai 2009
Statut
Membre
Dernière intervention
11 octobre 2013
15
6 janv. 2011 à 18:40
6 janv. 2011 à 18:40
Merci pour votre réponse, mais dans la question la classe E est d'un type quelconque, c'est à dire qu'elle peut être Number de laquelle hérite Integer, ou bien Animal de laquelle hérite chien... et le type n'est connu qu'après appel de la méthode affecter en lui passant les 2 paramètres(superclasse, SaClasseFille)
KX
Messages postés
16733
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 janvier 2024
3 015
Modifié par KX le 6/01/2011 à 19:29
Modifié par KX le 6/01/2011 à 19:29
E ne peut pas être totalement quelconque, ou alors il n'est pas utilisé dans sa propre classe mais dans une classe (A par exemple) qui dépend de E.
Mais dans ce cas, l'affectation ne pourra pas être une méthode static (car c'est l'instance de l'objet - de type A - qui permet de déterminer le type E)
De plus la méthode d'affectation ne pourra pas être générique dans l'absolu, elle dépendra de la structure de A et de ses dépendances en E.
Exemple :
La confiance n'exclut pas le contrôle
Mais dans ce cas, l'affectation ne pourra pas être une méthode static (car c'est l'instance de l'objet - de type A - qui permet de déterminer le type E)
De plus la méthode d'affectation ne pourra pas être générique dans l'absolu, elle dépendra de la structure de A et de ses dépendances en E.
Exemple :
public class A<E> { // Structure de A private String str; // Dépendances en E de A private E monE; // Constructeurs de A public A() { str=""; monE = null; } public A(String s, E e) { str = s; monE = e; } // Méthodes surchargées de Object public String toString() { return str+" "+monE; } // Méthodes de A<E> public void affecter(A<? extends E> a) { str = a.str; monE = a.monE; } // Test public static void main(String args[]) { A<Integer> i = new A<Integer>("Toto",3); A<Number> n = new A<Number>("Tata",null); n.affecter(i); System.out.println(n); // Toto 3 } }
La confiance n'exclut pas le contrôle
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci beaucoup KX, au fait c'est vrai que "la méthode d'affectation ne pourra pas être générique dans l'absolu, elle dépendra de la structure de A et de ses dépendances en E." Enfin j'ai trouvé la solution qui est:
class Affectation{
public static <A,E extends A,B extends E> void affect(A a,B b){
a=b;
}
de cette façon on pourra affecter un objet d'un sous type de E(ici c B) à un objet d'un super type quelconque de E(qui est ici A).
B------->E ---------A
^^ merci
class Affectation{
public static <A,E extends A,B extends E> void affect(A a,B b){
a=b;
}
de cette façon on pourra affecter un objet d'un sous type de E(ici c B) à un objet d'un super type quelconque de E(qui est ici A).
B------->E ---------A
^^ merci