overloading métodos - Covarianza y sobrecarga en Java





que operadores (5)


Como está utilizando el tipo de objeto A, puede llamar solo a f (AA). Porque B lo anula.

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?




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

El tipo de ab tiempo de compilación es A , por lo que el compilador, que es el que realiza la resolución de sobrecarga, determina que la única firma de método válida es f(A a) , por lo que la llama.

En el momento de la ejecución , esa firma de método se ejecuta como Bf(A a) porque B anula.

Recuerde siempre que la firma se elige en tiempo de compilación (sobrecarga) pero la implementación se elige en el momento de la ejecución (anulación).




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.




Si desea probar la respuesta con la mayoría de los votos arriba, simplemente puede usar este código:

public class Randomizer
{
    public static int generate(int min,int max)
    {
        return min + (int)(Math.random() * ((max - min) + 1));
    }

    public static void main(String[] args)
    {
        System.out.println(Randomizer.generate(0,10));
    }
}

Es simplemente limpio y simple.







java overloading covariance