Question en généricité en java
birdsfly
Messages postés
253
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
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
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Waptrick java voiture - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
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