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)