33 votes

Covariance et surcharge en Java

 class A {
   boolean f(A a) { return true; }
}
class B extends A {
   boolean f(A a) { return false; } // override A.f(A)
   boolean f(B b) { return true; }  // overload A.f
}

void f() {  
   A a = new A();
   A ab = new B();
   B b = new B();
   ab.f(a); ab.f(ab); ab.f(b); //(1) false, false, *false*
   b.f(a); b.f(ab); b.f(b);    //(2) false, false, true
}
 

Pouvez-vous expliquer la première fausse sortie de la première ligne, pourquoi ce n'est pas vrai?

59voto

Jon Skeet Points 692016

pouvez-vous expliquer la première ligne de la dernière fausse sortie, pourquoi il n'est pas vrai?

Le type de compilation d' ab est A, de sorte que le compilateur - qui est ce qui effectue la résolution de surcharge - détermine que la seule méthode valable signature est - f(A a), donc il appelle ça.

Lors de l'exécution en temps, que la signature de la méthode est exécutée en tant que B.f(A a) car B le remplace.

Rappelez-vous toujours que la signature est choisi au moment de la compilation (surcharge), mais la mise en œuvre est choisie au moment de l'exécution (primordial).

1voto

Ahmad Points 1147

Eh bien ... parce que vous appelez sur le type de A. Donc, vous ne pouvez appeler que la version de f (A a). qui revient faux en B.

1voto

LGAP Points 886

Puisque vous utilisez le type d'objet A, vous ne pouvez appeler que f (AA). Parce que B l'emporte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X