Menu
Coddy logo textTech

Métodos Genéricos

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 55 de 87.

Embora as classes genéricas façam com que classes inteiras funcionem com diferentes tipos, às vezes você só precisa que um único método seja genérico. Um método genérico declara seu próprio parâmetro de tipo, independentemente de quaisquer tipos genéricos no nível da classe.

O parâmetro de tipo aparece antes do tipo de retorno na assinatura do método:

public class Utility {
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.println(element);
        }
    }
}

String[] names = {"Alice", "Bob"};
Integer[] numbers = {1, 2, 3};

Utility.printArray(names);    // Funciona com String[]
Utility.printArray(numbers);  // Funciona com Integer[]

Observe o <T> colocado entre os modificadores e o tipo de retorno. Isso declara T como um parâmetro de tipo para esse método específico. O compilador infere o tipo real a partir dos argumentos que você passa.

Métodos genéricos também podem retornar o tipo genérico:

public static <T> T getFirst(T[] array) {
    if (array.length > 0) {
        return array[0];
    }
    return null;
}

String first = getFirst(new String[]{"a", "b"});  // Retorna "a"

Você pode usar vários parâmetros de tipo quando necessário:

public static <K, V> void printPair(K key, V value) {
    System.out.println(key + ": " + value);
}

printPair("Age", 25);        // String e Integer
printPair(1, "First");       // Integer e String

Métodos genéricos são particularmente úteis em classes utilitárias nas quais você precisa de operações flexíveis e reutilizáveis sem criar uma classe genérica.

challenge icon

Desafio

Fácil

Vamos criar um kit de ferramentas utilitárias que demonstra a flexibilidade dos métodos genéricos. Você criará uma classe com métodos reutilizáveis que funcionam com qualquer tipo, demonstrando como métodos genéricos podem existir independentemente de classes genéricas.

Você organizará seu código em dois arquivos:

  • ArrayUtils.java: Crie uma classe utilitária contendo métodos genéricos para trabalhar com arrays. Sua classe deve ter três métodos genéricos estáticos:

    getLast - Um método genérico que recebe um array do tipo T e retorna o último elemento. Se o array estiver vazio, retorne null.

    swap - Um método genérico que recebe um array do tipo T e dois índices inteiros, então troca os elementos nessas posições. Esse método não retorna nada.

    printWithLabel - Um método genérico com dois parâmetros de tipo K e V. Ele recebe um rótulo do tipo K e um valor do tipo V, então os imprime no formato: [label]: [value]

  • Main.java: Coloque seus métodos genéricos em prática! Você receberá quatro entradas: duas palavras (Strings) e dois números (inteiros).

    Primeiro, crie um array String[] contendo ambas as palavras. Use getLast para obter o último elemento e imprima: Last word: [result]

    Em seguida, crie um array Integer[] contendo ambos os números. Chame swap para trocar os elementos nos índices 0 e 1; depois, imprima: After swap: [first], [second]

    Por fim, demonstre o método genérico com dois parâmetros chamando printWithLabel duas vezes:

    • Uma vez com a primeira palavra como o rótulo e o primeiro número como o valor
    • Uma vez com o primeiro número como o rótulo e a segunda palavra como o valor

Você receberá quatro entradas na ordem: primeira palavra, segunda palavra, primeiro número, segundo número.

Observe como cada método declara seus próprios parâmetros de tipo com <T> ou <K, V> antes do tipo de retorno. O compilador infere os tipos reais a partir dos argumentos que você passa: não é necessário especificá-los explicitamente ao chamar os métodos!

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler entradas
        String firstWord = scanner.nextLine();
        String secondWord = scanner.nextLine();
        int firstNumber = scanner.nextInt();
        int secondNumber = scanner.nextInt();
        
        // TODO: Crie um array String[] contendo ambas as palavras
        
        // TODO: Use ArrayUtils.getLast para obter o último elemento
        // Imprima: "Last word: [result]"
        
        // TODO: Crie um array Integer[] contendo ambos os números
        
        // TODO: Chame ArrayUtils.swap para trocar os elementos nos índices 0 e 1
        // Imprima: "After swap: [first], [second]"
        
        // TODO: Chame ArrayUtils.printWithLabel com firstWord como label e firstNumber como value
        
        // TODO: Chame ArrayUtils.printWithLabel com firstNumber como label e secondWord como value
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Java online