Como criar métodos genéricos em Java?
Os métodos genéricos em Java permitem criar funções que podem operar em diferentes tipos de dados, tornando o código mais reutilizável e flexível. Eles são úteis quando o mesmo método pode ser aplicado a múltiplos tipos sem precisar ser reescrito.
1. Definição de Métodos Genéricos
Para criar um método genérico, usamos parâmetros de tipo <T>
antes do tipo de retorno:
class Util {
public static <T> void imprimir(T valor) {
System.out.println(valor);
}
}
public class TesteGenerics {
public static void main(String[] args) {
Util.imprimir(10); // Inteiro
Util.imprimir("Olá, mundo!"); // String
Util.imprimir(3.14); // Double
}
}
Saída esperada:
10
Olá, mundo!
3.14
Aqui, o método imprimir()
aceita qualquer tipo de dado, pois o tipo T
é definido dinamicamente durante a chamada do método.
2. Criando Métodos Genéricos com Retorno
Também podemos criar métodos genéricos que retornam valores:
class Util {
public static <T> T retornarMesmoValor(T valor) {
return valor;
}
}
public class TesteGenerics {
public static void main(String[] args) {
System.out.println(Util.retornarMesmoValor("Teste"));
System.out.println(Util.retornarMesmoValor(42));
}
}
Saída esperada:
Teste
42
Aqui, retornarMesmoValor()
recebe um valor genérico e o retorna sem alterar seu tipo.
3. Métodos Genéricos com Múltiplos Tipos
Podemos definir múltiplos parâmetros genéricos:
class Util {
public static <T, U> void mostrarTipos(T primeiro, U segundo) {
System.out.println("Tipo T: " + primeiro.getClass().getName());
System.out.println("Tipo U: " + segundo.getClass().getName());
}
}
Chamando o método:
public class TesteGenerics {
public static void main(String[] args) {
Util.mostrarTipos("Texto", 123);
}
}
Saída esperada:
Tipo T: java.lang.String
Tipo U: java.lang.Integer
Aqui, mostrarTipos()
aceita dois parâmetros de tipos diferentes e imprime suas classes.
4. Restrições em Métodos Genéricos
Podemos restringir os tipos permitidos em métodos genéricos com extends
:
class Matematica {
public static <T extends Number> double somar(T a, T b) {
return a.doubleValue() + b.doubleValue();
}
}
Esse método aceita apenas tipos numéricos, como Integer
, Double
, etc. Chamando-o:
public class TesteGenerics {
public static void main(String[] args) {
System.out.println(Matematica.somar(5, 10)); // Inteiros
System.out.println(Matematica.somar(2.5, 3.1)); // Doubles
}
}
5. Quando Usar Métodos Genéricos?
- Para evitar código duplicado ao lidar com diferentes tipos de dados.
- Em classes utilitárias como
Collections
para operações flexíveis. - Ao criar métodos reutilizáveis que podem operar em diferentes classes sem precisar definir um tipo fixo.
Conclusão
Métodos genéricos tornam o código mais modular e flexível, permitindo reutilização sem precisar definir explicitamente tipos de dados. Eles são amplamente usados em bibliotecas Java, como Collections
, e facilitam a programação orientada a objetos de maneira eficiente.
Por que os métodos genéricos são amplamente usados em bibliotecas Java?
Os métodos genéricos são amplamente utilizados em bibliotecas Java, especialmente na API de Collections. Classes como ArrayList<T>
, HashMap<K, V>
e Comparator<T>
utilizam generics para permitir flexibilidade e reutilização sem a necessidade de conversões explícitas. Além disso, frameworks como Spring e Hibernate também fazem uso extensivo de generics para abstrair lógica e facilitar a injeção de dependências. Entender métodos genéricos permite escrever código mais limpo, seguro e reutilizável, reduzindo erros de tipo em tempo de compilação.
Algumas aplicações:
- Criação de coleções genéricas
- Implementação de algoritmos reutilizáveis
- Redução de código duplicado
- Facilidade na manipulação de tipos em APIs
Dicas para quem está começando
- Use generics para evitar conversões explícitas de tipo
- Prefira
ao trabalhar com números - Explore a API Collections para entender como generics são aplicados
- Pratique criando classes e métodos genéricos próprios
- Evite o uso excessivo de generics quando não for necessário
Contribuições de Rodrigo Farias