Pesso perdão a todos que leram o post antes deste update pois haviam 2 erros graves. O primeiro era a grafia da palavra generics como ressaltou um leitor nos comentários.
O segundo era que eu esqueci de trocar os sinais de < e > pelos seus respectivos códigos HTML numéricos.
Agora sim o post está funcionando :D e coloquei nos links abaixo os códigos usados para ilustrar os exemplos.
Desculpa aí pessoal, qualquer coisa comente aí!
http://geocities.yahoo.com.br/sadbuttruebr/blog/
exemplos_java/Caixa.java
http://geocities.yahoo.com.br/sadbuttruebr/blog/
exemplos_java/CaixaGenerica.java
[/update]
Dae pessoal, estamos aqui para mais um post de (in)utilidade pública e que já deve ter sido publicado em n sítios/blogs por aí na rede bem melhor redigido do que o meu :P, masss o meu é melhor! Hehehe ao menos eu e a minha mãe achamos... :P
Não sei como vivemos tanto tempo sem os tipos genéricos no Java. Que trabalho insano dava fazer certas coisas além de estarmos à mercê de erros bizarros. Vamos ilustrar a dor de cabeça com uma classe simples chamada Caixa.java que tem dois métodos: colocarNaCaixa e mostrarConteudo. O que a classe faz nada mais é do que criar uma caixa que recebe um objeto de qualquer tipo e mostra que tipo é o objeto colocado lá dentro e seu valor.
Vamos ao que é good, código!
public class Caixa {
private Object objeto;
public void colocarNaCaixa(Object objeto) {
this.objeto = objeto;
}
public Object mostrarConteudo() {
return objeto;
}
public static void main(String[] args) {
Caixa cxInteiros = new Caixa();
cxInteiros.colocarNaCaixa(10);
int i = (Integer)cxInteiros
.mostrarConteudo();
System.out.println("Tipo do objeto posto
na caixa: " + cxInteiros
.mostrarConteudo().getClass()
.getName());
System.out.println("Valor do objeto posto
na caixa: " + i);
Caixa cxStrings = new Caixa();
cxStrings.colocarNaCaixa("Olá genéricos");
String valor = (String)cxStrings
.mostrarConteudo();
System.out.println("Tipo do objeto posto
na caixa: " + cxStrings.mostrarConteudo()
.getClass().getName());
System.out.println("Valor do objeto posto
na caixa: " + valor);
}
}
Notem o seguinte, NADA impede de eu colocar qualquer tipo de conteúdo na minha caixa, a não ser uma convenção fraca explícita no código, algo como:
//Caixa só para inteiros
Caixa cx = new Caixa();
Patético... fora os inúmeros casts inúteis que temos:
Caixa cxInteiros = new Caixa();
cxInteiros.colocarNaCaixa(10);
int i = (Integer)cxInteiros.mostrarConteudo();
Bom como solucionar esse tipo de coisa?
Resposta: GENERICS!
O que é um objeto/método genérico?
É uma classe/método que só aceita um certo tipo de parâmetro... ta deixemos de blablabla e vamos ao código disto tudo:
public class CaixaGenerica<T> { //Ai já diremos que
//tipo de dado
//esperar.
private T objeto; //T é do mesmo tipo do T que
//especificamos quando instan-
//ciamos o objeto.
public void colocarNaCaixa(T objeto) {
this.objeto = objeto;
}
public T mostrarConteudo() {
return objeto;
}
public static void main(String[] args) {
//Instanciamos uma caixa só para inteiros
CaixaGenerica<Integer> cxInteiros =
new CaixaGenerica<Integer>();
cxInteiros.colocarNaCaixa(10);
/*
* O melhor, sem CAST! O compilador sabe que
* tipo de dados tem na caixa.
*/
int i = cxInteiros.mostrarConteudo();
System.out.println("Tipo do objeto posto na
caixa: " + cxInteiros.mostrarConteudo().getClass()
.getName()
);
System.out.println("Valor do objeto posto
na caixa: " + i);
CaixaGenerica<String> cxPalavras =
new CaixaGenerica<String>();
cxPalavras.colocarNaCaixa("Java Generics é
o bixo!");
String palavra = cxPalavras.mostrarConteudo();
System.out.println("Tipo do objeto posto
na caixa: " + cxPalavras.mostrarConteudo().getClass()
.getName());
System.out.println("Valor do objeto posto
na caixa: " + palavra );
}
}
Não tem como instanciarmos uma caixa de um gênero e tentarmos atribuir um valor de outro a caixa... dará erro ao tentarmos compilar a classe.
Agora pense em todo tipo de coleção que você já usou antes dos generics que agora lhe
poupariam algum tempo sem casts e sem erros...
Isso é post de coisa antigaaaaaa, só para encher lingüiça mesmo, mas me espanta gente que se diz desenvolvedor Java e não conhece generics.
Até a próxima e já sabe né... comenta aí!