Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida no Ex. 5 da Aula 3 - Crie métodos sobrecarregados

Nesse caso, o compilador não deveria entender que era para executar o método estatico a(B b)? pois D extende de B.

2 respostas
solução!

Retirado do texto da explicação desse capítulo:

No caso de sobrecarga com tipos que possuem polimorfismo, como em Object ou String, o compilador sempre invoca o método com o tipo mais específico (menos genérico):

public class Teste {
    void metodo(Object o) {
        System.out.println("object");
    }
    void metodo(String s) {
        System.out.println("string");
    }

    public static void main(String[] args) {
        new Teste().metodo("string"); // imprime string
    }
}

Se quisermos forçar a invocação ao método mais genérico, devemos fazer o casting forçado:

public class Teste {
    void metodo(Object o) {
        System.out.println("object");
    }
    void metodo(String s) {
        System.out.println("string");
    }

    public static void main(String[] args) {
        new Teste().metodo((Object)"string"); // imprime object
    }
}

Ou seja, voltando à sua dúvida no exercício. O erro de compilação se dá pq ele tenta acessar o método com parâmetro menos genérico, que é o método não-estático. Para fazer esse código do exercício funcionar, você tem que fazer o casting forçado:

System.out.println(a((B) new D()));

valew