Java Generics é uma das características mais importantes da linguagem Java. A ideia por trás dos genéricos é bastante simples, no entanto, às vezes sai como complexa por causa da mudança da sintaxe usual associada a ele.
o propósito deste tutorial é apresentá-lo a este conceito útil de genéricos de uma maneira fácil de entender.
mas antes de mergulhar em genéricos em si, vamos descobrir por que os genéricos Java foram necessários em primeiro lugar.,
Finalidade de Java Generics
Antes da introdução dos genéricos no Java 5, você poderia escrever e compilar um fragmento de código como este, sem que ocorra um erro ou um aviso:
Você pode adicionar valores de qualquer tipo para uma lista ou outra Java Coleção sem ter de declarar o tipo de dados que armazena. Mas quando você recupera valores da lista, você tem que lançá-lo explicitamente para um determinado tipo.
considere a iteração através da lista acima.,
Permitir a criação de uma lista sem o primeiro a declarar o tipo de dados armazenados, como fizemos, poderia resultar em programadores de cometer erros, como acima, que joga ClassCastExceptions
durante o tempo de execução.os genéricos foram introduzidos para evitar que os programadores cometessem tais erros.
com genéricos, você pode declarar explicitamente o tipo de dados que vai ser armazenado ao criar uma coleção Java, como mostra o exemplo a seguir.,
Now, you cannot mistakenly store an Integer in a String type list without throwing a compile-time error. Isto garante que o seu programa não corre em erros de tempo de execução.
o principal objectivo da introdução de genéricos em Java era evitar correr paraClassCastExceptions
durante o período de execução.
criando genéricos Java
pode usar genéricos para criar classes e métodos Java., Vejamos os exemplos de como criar genéricos de cada tipo.
classe genérica
ao criar uma classe genérica, o parâmetro de tipo para a classe é adicionado no final do nome da classe dentro do ângulo <>
entre parêntesis.
Aqui, T
é o parâmetro do tipo de dados. T
N
e E
são algumas das letras utilizadas para o tipo de dados de parâmetros de acordo com Java convenções.,
no exemplo acima, você pode passar-lhe um tipo de dados específico ao criar um objeto de classe GenericClass.
Você não pode passar um tipo de dados primitivo para o parâmetro do tipo de dados ao criar um objeto de classe Genérico. Somente os tipos de dados que estendem o tipo de objeto podem ser passados como parâmetros de tipo.
Por exemplo:
métodos genéricos
criar métodos genéricos segue um padrão semelhante ao criar classes genéricas. Você pode implementar um método genérico dentro de uma classe genérica, bem como um não-Genérico.,
Aqui, você pode passar um array de um tipo específico para parameterizar o método. The generic method PrintItems()
iterates through the passed array and prints the items stored just like a normal Java method.
parâmetros do tipo limitado
até agora, as classes genéricas e métodos que criamos acima podem ser parametrizados para qualquer tipo de dados que não tipos primitivos. Mas e se quiséssemos limitar os tipos de dados que podem ser passados aos genéricos? É aqui que entram os parâmetros do tipo limitado.,
pode ligar os tipos de dados aceites por uma classe ou método genérico, especificando que deve ser uma subclasse de outro tipo de dados.
Por exemplo:
Aqui UpperBoundedClass
e UpperBoundedMethod
só pode ser parametrizada usando subtipos de List
tipo de dados.
List
o tipo de dados actua como um limite superior ao parâmetro do tipo. Se você tentar usar um tipo de dados que não é um subtipo de List
, ele irá lançar um erro de tempo de compilação.
os limites não estão limitados a apenas classes., Você pode passar interfaces também. Estender a interface significa, neste caso, implementar a interface.
um parâmetro também pode ter vários limites como este exemplo mostra.
o tipo de dados que Aceita deve ser uma subclasse das classes Animal e Mammal. Se um desses limites é uma classe, ela deve vir em primeiro lugar na declaração vinculada.no exemplo acima, se mamífero é uma classe e Animal é uma interface, mamífero deve vir em primeiro lugar como mostrado acima. Caso contrário, o código gera um erro de tempo de compilação.,
Java Generics Wildcards
Wildcards are used to pass on parameters of generic types to methods. Ao contrário de um método genérico, aqui, o parâmetro genérico é passado para os parâmetros aceitos pelo método, que é diferente do parâmetro do tipo de dados que discutimos acima. Um wildcard é representado pelo ? simbolo.
the above printItems()
method accepts lists of any data type as the parameter. Isso impede que os programadores tenham que repetir códigos para listas de diferentes tipos de dados, o que seria o caso sem genéricos.,
Wildcards
Se quisermos limitar os tipos de dados armazenados na lista aceite pelo método, podemos usar wildcards limitados.
exemplo:
printSubTypes()
o método aceita apenas as listas que armazenam subtipos de cor. Ele aceita uma lista de objetos RedColor ou BlueColor, mas não aceita uma lista de objetos animais. Isto é porque o Animal não é um subtipo de cor. Este é um exemplo de um wildcard delimitado por cima.,
Menor Delimitada Curingas
da mesma forma, se tivéssemos:
em seguida, o printSuperTypes()
método só aceita listas de loja super tipos de Cão de classe. Ele aceitaria uma lista de objetos de mamíferos ou animais, mas não uma lista de objetos de LabDog porque LabDog não é uma superclasse de cão, mas uma subclasse. Este é um exemplo de um wildcard menor.
Conclusion
Java Generics has become a feature that programmers cannot live without since its introduction.
esta popularidade é devido ao seu impacto em tornar a vida dos programadores mais fácil., Além de impedi-los de cometer erros de codificação, o uso de genéricos torna o código menos repetitivo. Você notou como ele generaliza classes e métodos para evitar ter que repetir o código para diferentes tipos de dados?ter uma boa compreensão dos genéricos é importante para se tornar um especialista na linguagem. Então, aplicar o que você aprendeu neste tutorial em código prático é o caminho a seguir agora.