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
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


A voir également:

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
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...

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
}
1
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
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 :

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
0
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
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)
0
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
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 :

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
0

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
0