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 :

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);
         //
         }
}
voilà la sortie du programme :

/ 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