Fiquei meio perdido sobre qual a regra disso acontecer porque não entendi se isso é um overloading ou overriding, e nem tenho muita idéia de como funcionam com genericos… =(
Me parece que é devido ao método mais específico, pois deve sempre vir abaixo… leia a parte da luva de beisebol, no livro da Kathy para entender melhor…
class Parent {
void say(Number number) {
System.out.println("Normal");
}
public static void main(String[] args) {
Parent p = new Parent();
Parent p2 = new Child();
Child p3 = new Child();
Integer a = new Integer("43");
Double d = new Double("4.4");
Float f = new Float(5.9);
p.say(a);
p2.say(a);
p2.say(d);
p2.say(f);
/*p3.say(f); //esses aqui nao compilam porque da erro de ambiguidade...
p3.say(a); //achei estranho porque se a referencia é pra 'Child' por que
p3.say(d); //ele também procura em Parent? =P
*/
}
}
class Child extends Parent {
<T extends Number> void say(T number) {
System.out.println("Generic");
}
}
E se não me engano, esse código acima é um exemplo de sobrecarga e não de sobrescrita!
class Parent {
<T extends Number> void say(T number) {
System.out.println("Super generic");
}
public static void main(String[] args) {
Parent p = new Parent();
Parent p2 = new Child();
Child p3 = new Child();
Integer a = new Integer("43");
Double d = new Double("4.4");
Float f = new Float(5.9);
p.say(a);
p2.say(a);
p2.say(d);
p2.say(f);
p3.say(f);
p3.say(a);
p3.say(d);
}
}
class Child extends Parent {
@Override
void say(Number number) {
System.out.println("Child normal");
}
}
Esse codigo também compila como o Will tinha dito, mas é um override, certo?
Testem ae!