Nesse caso, o compilador não deveria entender que era para executar o método estatico a(B b)? pois D extende de B.
Nesse caso, o compilador não deveria entender que era para executar o método estatico a(B b)? pois D extende de B.
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