Seria bom se pudéssemos escrever um único método de classificação que pudesse classificar os elementos em um array Integer, um array String ou uma matriz de qualquer tipo que suporte ordenação.
Os métodos Java genéricos e classes genéricas permitem que os programadores especifiquem, com uma única declaração de método, um conjunto de métodos relacionados ou, com uma única declaração de classe, um conjunto de tipos relacionados, respectivamente.
Os genéricos também fornecem segurança de tipo em tempo de compilação que permite aos programadores capturar tipos inválidos em tempo de compilação.
Usando o conceito genérico Java, podemos escrever um método genérico para classificar uma matriz de objetos e, em seguida, invocar o método genérico com matrizes inteiras, matrizes Double, matrizes String e assim por diante, para classificar os elementos da matriz.
Métodos genéricos
Você pode escrever uma única declaração de método genérico que pode ser ca cheio de argumentos de diferentes tipos. Com base nos tipos de argumentos passados para o método genérico, o compilador trata cada chamada de método apropriadamente. A seguir estão as regras para definir métodos genéricos –
-
Todas as declarações de métodos genéricos têm uma seção de parâmetro de tipo delimitada por colchetes angulares (< e >) que precede o tipo de retorno do método “(< E > no próximo exemplo ).
-
Cada seção de parâmetro de tipo contém um ou mais parâmetros de tipo separados por vírgulas. Um parâmetro de tipo, também conhecido como variável de tipo, é um identificador que especifica um nome de tipo genérico .
-
Os parâmetros de tipo podem ser usados para declarar o tipo de retorno e atuar como marcadores para os tipos de argumentos passados para o método genérico, que são conhecidos como argumentos de tipo reais.
-
O corpo de um método genérico é declarado como o de qualquer outro método. Observe que os parâmetros de tipo podem representar apenas tipos de referência, não tipos primitivos (como int, double e char).
Exemplo
O exemplo a seguir ilustra como nós pode imprimir uma matriz de tipo diferente usando um único método genérico –
Isso produzirá o seguinte resultado –
Saída
Array integerArray contains:1 2 3 4 5 Array doubleArray contains:1.1 2.2 3.3 4.4 Array characterArray contains:H E L L O
Parâmetros de tipo limitado
Pode haver momentos em que você desejará restringir os tipos de tipos que podem ser passados para um parâmetro de tipo. Por exemplo, um método que opera em números pode deseja aceitar apenas instâncias de Number ou suas subclasses. É para isso que servem os parâmetros de tipo limitado.
Para declarar um parâmetro de tipo limitado, liste o nome do parâmetro de tipo, seguido pela palavra-chave extends, seguida por seu limite superior.
Exemplo
O exemplo a seguir ilustra como extends é usado em um sentido geral para significar “estende” (como nas classes) ou “implementa” (como nas interfaces) . Este exemplo é o método genérico para retornar o maior dos três objetos comparáveis –
Isso produzirá o seguinte resultado –
Saída
Max of 3, 4 and 5 is 5Max of 6.6,8.8 and 7.7 is 8.8Max of pear, apple and orange is pear
Classes genéricas
Uma declaração de classe genérica parece uma declaração de classe não genérica, exceto que o nome da classe é seguido por uma seção de parâmetro de tipo.
Assim como com genérico métodos, a seção de parâmetro de tipo de uma classe genérica pode ter um ou mais parâmetros de tipo separados por vírgulas. Essas classes são conhecidas como classes parametrizadas ou tipos parametrizados porque aceitam um ou mais parâmetros.
Exemplo
O exemplo a seguir ilustra como podemos definir uma classe genérica –
Isso produzirá o seguinte resultado –
Saída
Integer Value :10String Value :Hello World