Bonjour,
Je suis en présence de code que je cherche à simplifier (c'est un « test case »).
J'ai les 2 classes suivantes A et B :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public class A { private String ma1; private String ma2; private String ma3; public String getMa1() { return ma1; } public void setMa1(String ma1) { this.ma1 = ma1; } public String getMa2() { return ma2; } public void setMa2(String ma2) { this.ma2 = ma2; } public String getMa3() { return ma3; } public void setMa3(String ma3) { this.ma3 = ma3; } @Override public String toString() { return "A [ma1=" + ma1 + ", ma2=" + ma2 + ", ma3=" + ma3 + "]"; } }Et voici schématisé le programme principale :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public class B { private String mb1; private String mb2; private String mb3; public String getMb1() { return mb1; } public void setMb1(String mb1) { this.mb1 = mb1; } public String getMb2() { return mb2; } public void setMb2(String mb2) { this.mb2 = mb2; } public String getMb3() { return mb3; } public void setMb3(String mb3) { this.mb3 = mb3; } @Override public String toString() { return "B [mb1=" + mb1 + ", mb2=" + mb2 + ", mb3=" + mb3 + "]"; } }
qui me retourne cela:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public class App1 { public static void main(String[] args) { A a = new A(); a.setMa1("aaa111"); a.setMa2("aaa222"); a.setMa3("aaa333"); B b = new B(); b.setMb1("bbb111"); b.setMb2("bbb222"); b.setMb3("bbb333"); toto(a); toto(b); } private static <T> void toto(T obj) { if (obj instanceof A) { System.out.println("lulu: " + lulu((A) obj)); } if (obj instanceof B) { System.out.println("lulu: " + lulu((B) obj)); } System.out.println("class: " + obj.getClass().getName()); System.out.println("value: " + obj.toString()); } private static String lulu(A a) { return a.getMa1(); } private static String lulu(B b) { return b.getMb2(); } }
Ce que je veux faire, c'est de rendre générique la méthode lulu().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 lulu: aaa111 class: domiq.generics.A value: A [ma1=aaa111, ma2=aaa222, ma3=aaa333] lulu: bbb222 class: domiq.generics.B value: B [mb1=bbb111, mb2=bbb222, mb3=bbb333]
J'ai pensé à ça mais Eclipse me retourne une erreur car cela doit être faux.
L'erreur est la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public class App2 { public static void main(String[] args) { A a = new A(); a.setMa1("aaa111"); a.setMa2("aaa222"); a.setMa3("aaa333"); B b = new B(); b.setMb1("bbb111"); b.setMb2("bbb222"); b.setMb3("bbb333"); toto(a); toto(b); } private static <T> void toto(T obj) { System.out.println("lulu: " + lulu(obj)); // <== ERREUR !!! ??? System.out.println("class: " + obj.getClass().getName()); System.out.println("value: " + obj.toString()); } private static <T extends A> String lulu(T a) { return a.getMa1(); } private static <T extends B> String lulu(T b) { return b.getMb2(); } }
Est-ce que quelqu'un peut m'aider ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Bound mismatch: The generic method lulu(T) of type App2 is not applicable for the arguments (T). The inferred type T is not a valid substitute for the bounded parameter <T extends A>
Merci.
Partager