Você está na página 1de 24

Java Generics

Prof. Jos Fernando Rodrigues Jnior

Introduo

A partir da verso 5.0, a linguagem Java passou a suportar classes parametrizadas, ou Generics

Um exemplo a classe ArrayList

Quais tipos de objetos ela deve armazenar?

Exemplo de uma classe simples com parmetro T

Exemplo de uma classe simples com parmetro T

A classe Sample denominada classe genrica ou parametrizada

Os parmetros devem ser includos dentro de colchetes


angulares aps o nome da classe

Qualquer palavra no-chave pode ser usada, mas por conveno, o parmetro comea com uma letra maiscula
Os parmetros, ento, so usados ao longo da classe

Opo de compilao Xlint

A programao com Generics pode ser tornar complicada, pois h um nvel extra de cognio Uma maneira de se trabalhar com os problemas encontrados aumentar o nvel de detalhamento das mensagens do compilador javac

javac Xlint Sample.java

Exemplo - Pair

Exemplo - Pair

Exemplo - Pair

Sintaxe

A sintaxe em colchetes angulares no usada dentro do corpo da classe


public Pair<T>()

Para a definio acima, por exemplo, o constutor seria:


public Pair(T first, T second)

No entanto, quando uma instncia de uma classe parametriza criada, a sintaxe necessria
Pair<String> pair = new Pair<STring>(Mario", Prado");

Tipos

Classes parametrizadas no podem receber tipos primitivos como parmetros como int e double
Para o uso destes tipos, a compilao Java prov automaticamente tipos embutidos

int new Integer double new Double

Tipos primitivos embutidos - exemplo

Mltiplos parmetros

Uma classe genrica pode ter qualquer nmero de parmetros

A sintaxe a mesma, basta separar os parmetros por vrgulas

Mltiplos parmetros - exemplo

Mltiplos parmetros

Mltiplos parmetros

Limitantes para os parmetros


Para se trabalhar com um tipo desconhecido faz todo o sentido saber pelo menos do que esse tipo capaz Para isso, possvel definir limitantes para quais tipos podem ser fornecidos a uma classe parametrizada Pode-se exigir que um determinado tipo a ser passado para a classe herde de uma determinada classe ou implemente um dada interface, por exemplo:

Para garantir que uma classe genrica seja serializvel, pode-se requerer a interface Serializable:
public class ClasseExemplo<T extends Serializable>

Obs.: nesta sintaxe no se usa a palavra chave implements

Exemplo interface Comparable

Mtodos Genricos

Mtodos genricos podem ser definidos independentemente dos parmetros de sua classe

Mesmo que a classe no receba parmetro, seus mtodos podem receber

Mesmo em uma classe que recebe parmetros, os parmetros dos mtodos podem ser diferentes dos da classe

Mtodos Genricos

Sintaxe da definio de um mtodo genrico


public <U> void MetodoGenerico(U a)

Sintaxe do uso de um mtodo genrico


String c = teste; UmaClasse umaClasse = new UmaClasse(); umaClasse.<String>MetodoGenerico(c);

Herana com classes genricas

Classes genricas podem ser usadas em herana como qualquer outra, podendo herdar de classes no genricas ou genricas

Importante noo:

Dada uma classe genrica G<T> Dadas duas classes quaisquer A e B

G<A> no tem qualquer relao com G<B>; so classes diferentes

Herana com classes genricas

Herana com classes genricas

Limitaes

Os parmetros de uma classe no so flexveis como o identificador de uma classe convencional Especificamente, um tipo parmetro no pode ser usado em expresses new dentro da classe parametrizada
T object = new T(); T[] a = new T[10]; Pair<String>[] a = new Pair<String>[10]; Nenhuma destas expresses vlida pode levar a problemas de pr-compilao, como recurso infinita

Limitaes

Os parmetros de uma classe no so flexveis como o identificador de uma classe convencional Especificamente, um tipo parmetro no pode ser A soluo destas limitaes usado em expresses new um o uso de colees, dentro da classe parametrizada conjunto de classes Generic j
presentes na API Java T object = new T(); prximas aulas
T[] a = new T[10]; Pair<String>[] a = new Pair<String>[10]; Nenhuma destas expresses vlida pode levar a problemas de pr-compilao, como recurso infinita

Você também pode gostar