Dúvida - Métodos Genéricos

Estava fazendo uns testes sobre generics e de repente vejo 2 questões assim:

[code]class Parent {
void say(Number number) {
}
}

class Child extends Parent {
void say(T number) {
}
}[/code]

Nesse caso o código não compila.

[code]class Parent {
void say(T number) {
}
}

class Child extends Parent {
void say(Number number) {
}
}[/code]

Agora neste caso, o código compila!

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… =(

Se alguém aí puder me ajudar agradeço já ! =)

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…

Confesso que não entendi!

//Neste caso funciona
class Child extends Parent {   
    <T> void say(T number) {   
    }   
}

//Porque

class Child extends Parent {   
    <T extends Number> void say(T number) {   
    }   
}  
//Não funciona????????????????

Poxa Ninguém vai tirar essa dúvida nossa??? Fica Lançado o desafio.

Nao entendi galera…

Acabei de fazer esse codigo e ele compila o_O

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!