Question en généricité en java
birdsfly
Messages postés
240
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Je viens de voir la notion de généricité en java et j'ai encore besoin d'un peu temps pour la bien saisir, alors si quelqu'un pourrait m'aider avec cette question ce serait vraiment sympa:
définir une méthode générique qui permet d'affecter un objet d'un sous type de E à un objet d'un super type quelconque de E.
Au fait j'ai essayé vainement de créer cette méthode, peut être je dois commencer avec quelque chose comme ça ? :
public static affecter(<? extends E> e){
// et puis??
}
merci d'avance
Je viens de voir la notion de généricité en java et j'ai encore besoin d'un peu temps pour la bien saisir, alors si quelqu'un pourrait m'aider avec cette question ce serait vraiment sympa:
définir une méthode générique qui permet d'affecter un objet d'un sous type de E à un objet d'un super type quelconque de E.
Au fait j'ai essayé vainement de créer cette méthode, peut être je dois commencer avec quelque chose comme ça ? :
public static affecter(<? extends E> e){
// et puis??
}
merci d'avance
A voir également:
- Question en généricité en java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
5 réponses
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 }
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
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)
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