Como criar métodos genéricos em Java?

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.

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.

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

Compartilhe este tutorial: Como criar métodos genéricos em Java

Compartilhe este tutorial

Continue aprendendo:

Qual a diferença entre equals e == em Java

O operador == compara referências de memória, enquanto o método equals() verifica a igualdade de conteúdo entre objetos em Java.

Tutorial anterior

Como funciona a tipagem genérica Generics em Java

A tipagem genérica (Generics) em Java permite criar classes, interfaces e métodos que podem operar sobre diferentes tipos, garantindo segurança e flexibilidade no código.

Próximo tutorial