Oi pessoal. Estou estudando generics, e cheguei na parte que aborda métodos e construtores generic. Eu vi este exemplo no site da Sun, uma definição de um método generic:
public class Teste {
public <U> void inspect(U u){
System.out.println("U: " + u.getClass().getName());
}
public static void main(String[] args) {
Teste teste = new Teste( );
teste.inspect(new Integer(10));
}
}
O método inspect pode receber qualquer objeto como argumento, e ele imprimirá na saída padrão o nome da classe desse objeto.
A minha dúvida é: Qual a utilidade de métodos generics? Não seria a mesma coisa se eu deixasse o parâmetro do método como Object ao invés de definir um generic? Para que realmente serve utilizar métodos generics, qual são os benefícios?
Fazendo uma pequena alteração no código, vou te mostrar onde você pode usar generics e não consegue usar object.
public <U> U inspect(U u){
return u;
}
public Object inspect2(Object obj) {
return obj;
}
A linha abaixo utiliza o método inspect declarado com generics. Funciona perfeitamente:
Integer i1 = teste.inspect(new Integer("10"));
Já esta linha, utiliza a função declarada com Object. Não funciona. (A não ser que seja feito um typecast, o que é exatamente o que o generics tenta evitar.
Integer i2 = teste.inspect2(new Integer("10"));
Segue o código completo, obviamente com erro na linha indicada.
public class TesteGenerics {
public <U> U inspect(U u){
return u;
}
public Object inspect2(Object obj) {
return obj;
}
public static void main(String[] args) {
TesteGenerics teste = new TesteGenerics();
Integer i1 = teste.inspect(new Integer("10"));
Integer i2 = teste.inspect2(new Integer("10")); <----- Erro aqui
}
}
[quote=leonardo.moreti]Oi pessoal. Estou estudando generics, e cheguei na parte que aborda métodos e construtores generic. Eu vi este exemplo no site da Sun, uma definição de um método generic:
public class Teste {
public <U> void inspect(U u){
System.out.println("U: " + u.getClass().getName());
}
public static void main(String[] args) {
Teste teste = new Teste( );
teste.inspect(new Integer(10));
}
}
O método inspect pode receber qualquer objeto como argumento, e ele imprimirá na saída padrão o nome da classe desse objeto.
A minha dúvida é: Qual a utilidade de métodos generics? Não seria a mesma coisa se eu deixasse o parâmetro do método como Object ao invés de definir um generic? Para que realmente serve utilizar métodos generics, qual são os benefícios?
[/quote]
Nesse caso em particular dá no mesmo. Esse método nem deveria ser genérico.
Agora, se vc defenir o U na classe em vez de no construtor, ai sim tem vantagens.
Só complementando.
Sem generics, o compilador te deixa fazer coisas do tipo:
String i2 = (String)teste.inspect2(new Integer("10"));
O erro apareceria apenas em tempo de execução.
Já usando o método declarado com generics, o erro seria apontado em tempo de compilação.
String i1 = teste.inspect(new Integer("10"));