: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)