Dúvida - Métodos Genéricos

4 respostas
W

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

class Parent {
    void say(Number number) {
    }
}

class Child extends Parent {
    <T extends Number> void say(T number) {
    }
}

Nesse caso o código não compila.

class Parent {
    <T extends Number> void say(T number) {
    }
}

class Child extends Parent {
    void say(Number number) {
    }
}

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á ! =)

4 Respostas

F

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…

deyvid

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????????????????
deyvid

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

M

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!

Criado 17 de junho de 2009
Ultima resposta 2 de jul. de 2009
Respostas 4
Participantes 4