Covarianza y sobrecarga en Java



Answers

Bueno ... porque estás llamando al tipo de A. Entonces puedes llamar solo a la versión de f (A a). eso es regresar falso en B.

Question
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
}

¿Puedes explicar la primera línea del último resultado falso, por qué no es cierto?




¿Puedes explicar la primera línea del último resultado falso, por qué no es cierto?

Piensa lo contrario: -

intente comentar a continuación en la clase B (el código primordial)

boolean f(A a) { return false; } // override A.f(A)

y agregue syso en la clase A en este método -> boolean f(A a){....}

Entonces verás, ab.f(A a) o ab.f(B b) invocarán el método f(A a) de la clase A solamente.

Como ab es del tipo A.

También tenga en cuenta que no podrá llamar a ningún método de la clase B también desde el objeto ab.

Espero que esto añada más aclaraciones a las respuestas brillantes anteriores.

Por último, puede buscar esto ahora -> ¿Por qué asignamos una referencia padre al objeto hijo en Java?




Related