Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/12/2012, 13h15   #1
michelp3
Membre du Club
 
Inscription : novembre 2009
Messages : 142
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 142
Points : 41
Points : 41
Par défaut Méthode générique non static

Bonjour voici un code très simple mais je ne vois pas pourquoi çà coince

Meci de votre aide

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
package ajeter;
 
 
class C <T> {
 
	public void  m1(<? extends T> val2){
				System.out.println(val2);
 
	}
}
 
public class Nice2 {
	public static void main(String[] args) {
		Integer i = 4;
		C<Number> c = new C<Number>();
		c.m1(i);
	}
}
michelp3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 14h02   #2
ncckto
Invité de passage
 
Inscription : juillet 2005
Messages : 8
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 8
Points : 3
Points : 3
Bonjour,
si j'ai bien compris ce que tu veux faire, je te propose ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class C<T> {
 
  public void m1(T val2) {
    System.out.println(val2);
  }
}
 
public class Nice2 {
 
  public static void main(String[] args) {
    C<? super Integer> c = new C<Number>();
    c.m1(4);
  }
 
}
cordialement
ncckto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 15h24   #3
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 121
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 121
Points : 10 358
Points : 10 358
Envoyer un message via Skype™ à thelvin
Citation:
Envoyé par michelp3 Voir le message
Bonjour voici un code très simple mais je ne vois pas pourquoi çà coince
Parce que <? extends T> n'est pas un type et n'a donc rien à faire tout seul devant un nom de variable.

Si tu cherches un type générique auquel on peut assigner n'importe quel objet de type T ou d'un sous-type de T.... Eh ben c'est T, tout simplement. Principe habituel de l'héritage.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
Partagez vos connaissances, mais aussi comment s'en servir.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 15h44   #4
michelp3
Membre du Club
 
Inscription : novembre 2009
Messages : 142
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 142
Points : 41
Points : 41
Par défaut Bonjour Thelvin, ncckto

OK mais alors comment je fais si je souhaite imposer

que les arguments passés à la méthode soient des classes filles de T
michelp3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 16h00   #5
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 121
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 121
Points : 10 358
Points : 10 358
Envoyer un message via Skype™ à thelvin
Uniquement des classes filles et pas T lui-même ? Tu peux pas. Une méthode par classe fille acceptée.

Bien sûr, une idée simple serait de le faire quand tu choisis T : faire que ce soit une interface, ou une classe abstraite. Comme une interface ou une classe abstraite ne peuvent pas être instanciées, les objets seront forcément de classes filles.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
Partagez vos connaissances, mais aussi comment s'en servir.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/12/2012, 16h49   #6
michelp3
Membre du Club
 
Inscription : novembre 2009
Messages : 142
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 142
Points : 41
Points : 41
Par défaut Merci

Ok pour la question précédente mais ceci est aussi basique et m'ennuie autant

Pourquoi la méthode add() ne fonctionne pas

Merci d'avance

Code :
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
 
 
package ajeter;
 
import java.util.ArrayList;
import java.util.List;
 
class Personne{
 
}
 
class Employee extends Personne{
 
}
 
public class Nice3_75_76 {
	public static void main(String[] args) {
		List <? extends Personne> al = new ArrayList<Employee>();
 
			Employee employee = new Employee();
 
			al.add(new Employee());
 
 
	}
 
}
michelp3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 17h10   #7
Cafeinoman
Membre à l'essai
 
Homme François Delalleau
Étudiant
Inscription : octobre 2012
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme François Delalleau
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2012
Messages : 25
Points : 22
Points : 22
Comme d'habitude, je suis pas sur, mais :

Code :
1
2
3
Employee employee = new Employee();
 
			al.add(new Employee());
ne devrait-il pas être :

Code :
1
2
3
Employee employee = new Employee();
 
			al.add(employee);
et ensuite, si comme c'est dit plus haut tu as fait de Personne une classe abstraite (ou une interface...), pourquoi ne pas mettre simplement :

Code :
List <Personne> al = new ArrayList<Employee>();
Toute complication entraîne un risque d'erreur... Je fais comme ça dans l'appli RH sur laquelle je bosse, et je n'ai pour l'instant jamais vu de Personne abstraite se pointer sur mon UI...
Cafeinoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2012, 18h38   #8
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 286
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 286
Points : 32 761
Points : 32 761
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
Je crois que tu as mal compris comment marche "?" dans les generic.

Ca ne veux pas dire "n'importe quoi", ça veux dire "quelque chose que je ne connais pas".

Ainsi quand tu dis que tu as une List<? extends Employee>, tu es occupé de dire au compilateur que la liste contient un type bien précis qui étends Employé MAIS que tu ne connais pas ce type (ça peut être Chef, Ouvrier ou ResponsableSyndicale).

Du coup, quand tu appelle la méthode add(T), le compilateur est incapable de connaitre le Type concret accepté et du coup est incapable de dire si le type Employee que tu essaie de passer en paramètre est recevable.


Pour expliquer avec un exemple:

Code :
1
2
3
4
List<Chef> liste = new ArrayList<Chef>();
List<? extends Employee> autreliste  = liste ; // ceci est valable, Chef est bien un QuelqueChose qui étends employé
autreliste.add(new Employee("Jean")); // est interdit
Chef chef = liste.get(0); // Sinon là on aurait un sérieux problème et un classcastexception à l'exécution.
Dis encore autrement, List<Employee>, ce n'est pas la même chose du tout que List<? extends Employee>

Dans le premier on peux lui passer des employés ou des sous type de employé. Dans le deuxième, on peux lui passer un "?" ou un sous type. Et comme on ne connais par définition pas ?, ça limite fortement l'utilisation
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 19/12/2012, 12h09   #9
michelp3
Membre du Club
 
Inscription : novembre 2009
Messages : 142
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 142
Points : 41
Points : 41
Par défaut Un peu plus lion

Bonjour Tchize et merci de ton explication complète qui m'a permis d'avancer

J'ai d'ailleurs revu mon code qui marie maintenant

GENERICITE et POLYMORPHISME

Voic le code , votre avis : Utile ou pas ???

Code :
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
 
package ajeter;
 
import java.util.ArrayList;
import java.util.List;
 
class Personne{
	public String nom;
	public Personne(String nom) {
		this.nom = nom;
	}
	public void quisuisje() {
		System.out.println("Je suis la méthode Personne");
	}
}
 
class Employee extends Personne{
 
	public Employee(String nom) {
		super(nom);
	}
	public void quisuisje() {
		System.out.println("Je suis la méthode Employee");
	}
}
 
class Outils extends Personne{
 
	public Outils(String nom) {
		super(nom);
	}
	public void quisuisje() {
		System.out.println("Je suis la méthode Outils");
	}
}
 
public class Nice3_75_76 {
	public static void main(String[] args) {
 
		// idée de départ afin d'ajouter des Employee à list0
		// List <Personne> liste0 = new ArrayList<Employee>();  //NOT OK
		//**************************************************************
 
		// Contourner le problème 
		//***********************
		ArrayList<Employee> ae = new ArrayList<Employee>();
		ae.add(new Employee("Patrick"));
		ae.add(new Employee("Edouard"));
		for (Employee employee : ae) {
			System.out.println(employee.nom);
		}
 
		List<Personne> liste0 = new ArrayList<Personne>();
 
		System.out.println("--------------");
		List <? extends Personne> l = ae;						
			for (Personne employee : l) {
			System.out.println(employee.nom);
			liste0.add(employee);
		}
 
		System.out.println("------------------");
		for (Personne personne : liste0) {
			System.out.println(personne.nom);
		}
 
		// Mélanger les Employee et les Outils Mais 
		// a chacun sa methode 
		//************************************
		System.out.println("************************");
		ArrayList<Outils> ao = new ArrayList<Outils>();
		ao.add(new Outils("marteau"));
		ao.add(new Outils("tournevis"));
		for (Outils outils : ao) {
			System.out.println(outils.nom);
		}
 
		System.out.println("--------------");
		l = ao;						
			for (Personne outils : l) {
			System.out.println(outils.nom);
			liste0.add(outils);
		}
 
		System.out.println("------------------");
			for (Personne personne : liste0) {
				System.out.println(personne.nom);
				personne.quisuisje();
			}
 
	}
 
}
michelp3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 00h30   #10
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 286
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 286
Points : 32 761
Points : 32 761
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
pour info, tu n'es pas obligé de faire ça

Code :
1
2
3
4
5
		l = ao;						
			for (Personne outils : l) {
			System.out.println(outils.nom);
			liste0.add(outils);
		}
Pour ajouter des items à liste0, tu peux simplement écrire

Code :
1
2
 
			liste0.addAll(ao);
ao contient des outils, des outils sont des personnes (ahem, pas le dire aux syndicats), donc on peux ajouter le contenu de ao dans liste0
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h53.


 
 
 
 
Partenaires

Hébergement Web