DEV Community

Métodos genéricos

  • Métodos de uma classe genérica usam automaticamente o parâmetro de tipo da classe.

  • É possível declarar métodos genéricos que têm seus próprios parâmetros de tipo, independentemente da classe.

  • Métodos genéricos podem ser criados dentro de classes não genéricas.

  • O exemplo apresentado inclui uma classe não genérica chamada GenericMethodDemo com um método genérico estático, arraysEqual().

  • O método arraysEqual() compara dois arrays para verificar se possuem os mesmos elementos, na mesma ordem, desde que sejam de tipos compatíveis e comparáveis.

// Demonstra um método genérico simples.
class GenericMethodDemo {
// Determina se o conteúdo de dois arrays é igual.
static <T extends Comparable<T>, V extends T> boolean
arraysEqual(T[] x, V[] y) { // Método genérico
// Se o tamanho dos arrays for diferente, os arrays também serão.
if(x.length != y.length) return false;
for(int i=0; i < x.length; i++)
if(!x[i].equals(y[i])) return false; // os arrays são diferentes
return true; // os conteúdos dos arrays são equivalentes
}
public static void main(String args[]) {
Integer nums[] = { 1, 2, 3, 4, 5 };
Integer nums2[] = { 1, 2, 3, 4, 5 };
Integer nums3[] = { 1, 2, 7, 4, 5 };
Integer nums4[] = { 1, 2, 7, 4, 5, 6 };
if(arraysEqual(nums, nums))
System.out.println("nums equals nums");
//Os argumentos de tipo de T e V são determinados implicitamente quando o método é chamado.
if(arraysEqual(nums, nums2))
System.out.println("nums equals nums2");
if(arraysEqual(nums, nums3))
System.out.println("nums equals nums3");
if(arraysEqual(nums, nums4))
System.out.println("nums equals nums4");
// Cria um array de Doubles
Double dvals[] = { 1.1, 2.2, 3.3, 4.4, 5.5 };
// Essa parte não será compilada, porque nums
// e dvals não são do mesmo tipo.
// if(arraysEqual(nums, dvals))
// System.out.println("nums equals dvals");
}
}

  • Observe como ele é declarado pela linha a seguir:
    static <T extends Comparable<T>, V extends T> boolean arraysEqual(T[] x, V[] y) {

  • Parâmetros de tipo no método genérico: São declarados antes do tipo de retorno do método.

  • Uso de limites superiores: O parâmetro de tipo T estende Comparable, garantindo que apenas objetos comparáveis sejam usados.

  • Relacionamento entre tipos: O parâmetro V tem como limite superior T, forçando compatibilidade entre os argumentos do método.

  • Métodos genéricos podem ser estáticos ou não: Não há restrições quanto à declaração de métodos genéricos como estáticos.

  • Inferência de tipos: Os tipos dos argumentos de um método genérico são detectados automaticamente durante a chamada, ajustando os parâmetros de tipo conforme necessário.

  • Exemplo de erro de tipo: A comparação entre arrays de tipos incompatíveis (como Integer e Double) resulta em erro de compilação devido à restrição de compatibilidade imposta pelo limite superior.

  • Sintaxe de método genérico:
    <lista-parâm-tipo> tipo-ret nome-mét(lista-parâm) { // ...

Top comments (0)