[Resolvido] Métodos Genéricos?

:arrow: Alguém consegue explicar o que são os famosos métodos genéricos que na maioria das vezes são citados em artigos e tutoriais? Quando se aplicam e porque utilizar? Tank’s.

Para ficar fácil de explicar: em um método normal, você passa apenas objetos como parâmetros. Em um método genérico, você pode também passar tipos.

Mas objeto não é um tipo?

Objeto é um objeto (ou seja, uma instância de uma classe).

Tipo é o tipo (por exemplo, classe) desse objeto .

(eu sei, eu sei, em algumas linguagens tipos e objetos são a mesma coisa - mas não em Java).

[quote=entanglement]Objeto é um objeto (ou seja, uma instância de uma classe).

Tipo é o tipo (por exemplo, classe) desse objeto .

(eu sei, eu sei, em algumas linguagens tipos e objetos são a mesma coisa - mas não em Java).

[/quote]
E como um método genérico vai saber quando está recebendo um tipo ou um objeto?

Ele sabe, porque é posto em um lugar diferente (entre <> em vez de () ), ou então é implícito a partir dos parâmetros objetos.

[quote=entanglement]Ele sabe, porque é posto em um lugar diferente (entre <> em vez de () ), ou então é implícito a partir dos parâmetros objetos.

[/quote]
Método normal:public void pintar(Quadro p) { }Método genérico:

public void pintar(<Quadro> p) { }ou genérico a partir da mistura dos dois:

public void pintar(Quadro p, <Quadro> p) { }Corretos os exemplos?

Não, ele não aparece dentro do parêntese. É mais ou menos assim:

class Classe {
    public <T>  int adicionar (T t) {
        ...
    }
...
Classe cl = new Classe();
String s;
cl.adicionar (s);
Integer t;
cl.adicionar (t);

Neste caso, o tipo é passado “implicitamente” (mas poderia ser passado explicitamente assim: )

cl.adicionar<Integer>(t);

Um probleminha é que no Java o tipo T (nesse caso) é “erased” (apagado), portanto o método não consegue saber exatamente o tipo passado se isso for necessário (por exemplo, para criar um novo objeto da mesma classe).
Para saber o tipo, é necessário passar também um objeto do tipo java.lang.Class. Algo como isto aqui:

    public int <T> adicionar (T t, Class<T> klass) {
        ...
    }
...
Integer t;
cl.adicionar (t, Integer.class);

E de onde vem esse tipo T que é apagado? Existe outra letra para este caso ou existe outra letra para outro caso diferente?

Pode-se usar um identificador completo; é que normalmente usa-se T, U e outras letras.

Para maiores detalhes, veja:

http://java.sun.com/docs/books/tutorial/java/generics/index.html

Esse tipo T não vem de lugar nenhum, eh como o entanglement disse, é uma classe de tipo desconhecido que soh vai ser conhecido quando passado por parametro…
=D

Ótimo. Estava pronta para perguntar sobre as classes abstratas mas o link já esclareceu. Tank’s 8)