Bonjour à tous,
J'essaye de résoudre une question d'un examen de juin 2003 et j'aurais besoin d'un coup de pouce pour une partie assez tordue du problème ...
voici le code :
voilà la sortie du programme :
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
37
38
39
40
41
42
43
44
45
46
47 class P { static void rint (String s) { System.out.println(s); } } abstract class A { String valueOf(){ return "[A]"; } void m(A x, A y){ P.rint( "Classe A" ); P.rint( valueOf() + x.valueOf() + y.valueOf() ); } } class B extends A { void m(A x, A y){ P.rint( "Classe B" ); P.rint( "[B]" + x.valueOf() + y.valueOf() ); } void m(A x, B y){ super.m(x, y); } void m(B y, A x){ m((A)y, x); } } class C extends B { String valueOf(){ return "[C]"; } void m(B x, B y){ P.rint( "Classe C" ); P.rint( "[C]" + x.valueOf() + y.valueOf() ); } } class appel { public static void main(String[] args) { A a = new B(); B b = new C(); P.rint("/ 1 /"); a.m(a, b); P.rint("/ 2 /"); a.m(b, b); //! b.m(b, b); // génère l'erreur suivante à la compilation : // appel.java:43: reference to m is ambiguous, both method m(A,B) in B and method m(B,A) in match b.m(b, b); // } }
/ 1 /
Classe B
[B][A][C]
Question 1 : Pourquoi la méthode appelée est B.m(A x, A y) au lieu de B.m(A x, B y) ?
Pourtant dans l'appel de méthode a.m(a, b), le paramètre a est bien de type statique A et b de type statique B !
/ 2 /
Classe B
[B][C][C]
Question 2 : Pourquoi la méthode appelée est B.m(A x, A y) ?
Dans l'appel de méthode a.m(b, b), les 2 paramètres sont de type statique B, pourquoi Java "upcast"-t-il les 2 paramètres vers le type A de manière à utiliser la méthode B.m(A x,A y) et pas plutôt uniquement le premier paramètre de manière à appeler la méthode B.m(B y,A x) ?
Question 3 : Si on décommente la ligne b.m(b.b), on obtient l'erreur de compilation mentionnée plus haut. Pourquoi ?
Comme l'Objet b est de type dynamique C et que les paramètres sont tous les deux de type statique B, Java devrait simplement appeler la méthode C.m(B x, B y) non ?
J'ai parcouru pas mal de cours et de tutoriels mais je n'ai pas trouvé d'explications précises à ces cas particuliers...
grand merci pour votre aide,
effco
Partager