Você está na página 1de 7

Generics em Java

Maydson Alves Ribeiro


Victor Brendon Batista Nunes
Willian Henrique Pereira Fontenele


Resumo: O abordado tema faz referencia ao Generics em Java, chamado
tambm de programao genrica, que serve basicamente para determinar
para o compilador qual tipo de classe deve ser interpretada.

Introduo
O referente artigo tem por
seu tema o "Generics em Java"
utilizado para poupar o
desenvolvedor de cdigos
redundantes. Um tipo Genrico
um tipo que possui um ou mais
parmetros de tipo.
Metodologia
A presente pesquisa teve seu
contedo inteiramente retirada da
internet onde continha sites que
hospedavam artigos, livros e
contedos acerca do tema dito
anteriormente.
Para fins de poder utilizar as
informaes contidas nesses sites,
sem que ficasse a ideia de plagio ao
final encontra-se a fonte das
informaes utilizadas.
Discusso
Genricos so a facilidade de
programao genrica que foram
adicionados linguagem de
programao Java, em 2004, dentro
de J2SE 5.0. Eles permitem que
"um tipo ou mtodo para operar em
objetos de vrios tipos,
proporcionando segurana tipo em
tempo de compilao".
Generics em java permitem
tipos(Classes e interfaces) para ser
parmetros na definio de classes,
interfaces e mtodos. Muito
parecido com os parmetros formais
mais conhecidas usadas em
declaraes de mtodos,
parmetros de tipo fornecem uma
maneira para que voc possa voltar
a utilizar o mesmo cdigo com
entradas diferentes. A diferena
que as entradas para os parmetros
formais so valores, enquanto as
entradas para digitar os parmetros
so tipos.
O cdigo que usa os genricos tem
muitas vantagens sobre o cdigo
no genrica:
Verificaes de tipo mais
forte em tempo de
compilao. Um compilador
Java aplica forte verificao
de tipo de cdigo e emite
erros genricos se o cdigo
viola tipo de segurana.
Corrigindo erros em tempo
de compilao mais fcil do
que corrigir erros de
execuo, o que pode ser
difcil de encontrar.
Ativando programadores para
implementar algoritmos
genricos. Usando os
genricos, os programadores
podem implementar
algoritmos genricos que
funcionam em colees de
diferentes tipos, podem ser
personalizados, e so
seguros e mais fcil de ler
tipo
Tipos genricos
Um tipo genrico uma classe
genrica ou interface que
parametrizado sobre tipos. A classe
seguinte caixa ser modificado para
demonstrar o conceito.
A Caixa Classe Simples
Comece examinando uma
classe Caixa no genrico que
opera em objetos de qualquer
tipo. Ele s precisa fornecer dois
mtodos: set, que adiciona um
objeto para o caixa, e obter, que
recupera-la:
Caixa public class {
object Object privado;

set public void (object Object)
{this.object = objeto; }
get public Object () {return
objeto; }
}
Desde seus mtodos aceitar ou
retornar um objeto, voc est livre
para passar o que quiser, desde
que no um dos tipos
primitivos. No h nenhuma
maneira de verificar, em tempo de
compilao, como a classe
usada. Uma parte do cdigo pode
colocar um nmero inteiro na caixa
e espera obter Integer s fora dele,
enquanto outra parte do cdigo
pode equivocadamente passar em
um String, resultando em um erro
de execuo.
A verso genrica da classe Box
A classe genrica definido com o
seguinte formato:
nome da classe <T1, T2, ..., Tn> {/
* ... * /}
A seo de parmetro de tipo,
delimitados por colchetes
angulares (<>),segue o nome da
classe. Ele especifica os parmetros
de tipo (tambm chamados
de variveis tipo) T1, T2, ..., e Tn.
Para atualizar a classe Box para
usar os genricos, voc cria
uma declarao de tipo
genrico, alterando o cdigo "Caixa
public class" para "public class Box
<T>". Isso introduz a varivel
tipo T, que pode ser usado em
qualquer lugar dentro da classe.
Com esta mudana, a
classe Caixa torna-se:
/ **
* Verso genrica da classe Caixa.
* @ Param <T> o tipo do valor que
est sendo encaixotado
* /
public class Box <T> {
/ / T significa "Type"
privado T t;

public void set (T t) {this.t = t; }
get T pblico () {return t; }
}
Como voc pode ver, todas as
ocorrncias do objeto so
substitudas por T.Uma varivel do
tipo pode ser qualquer tipo no
primitivo voc especificar: qualquer
tipo de classe, qualquer tipo de
interface, qualquer tipo de matriz, ou
mesmo outro tipo de varivel.
Esta mesma tcnica pode ser
aplicada para criar interfaces
genricas.
Convenes de nomenclatura
tipo de parmetro
Por conveno, os nomes de tipo de
parmetro, letras maisculas so
individuais. Isto est em ntido
contraste com as variveis de
nomeao convenes que voc j
conhece, e com razo: Sem esta
conveno, seria difcil dizer a
diferena entre uma varivel do tipo
e uma classe comum ou nome da
interface.
Os nomes de parmetro de tipo
mais comumente utilizados so:
E - Elemento (usado
extensivamente pelo Java
Collections Framework)
K - Chave
N - Nmero
T - Tipo
V - Valor
S, U, V, etc - 2, 3, 4 tipos
Voc vai ver esses nomes usados
em todo o API Java SE e no resto
desta lio.
Invocando e Instanciando um tipo
genrico
Para fazer referncia
classe Box genrico a partir do seu
cdigo, voc deve executar
uma invocao de tipo
genrico, que substitui T com algum
valor concreto, como Integer:
Box <Integer> integerBox;
Voc pode pensar em um tipo de
invocao genrica como sendo
semelhante a uma invocao de
mtodo comum, mas em vez de
passar um argumento para um
mtodo, voc est passando
um argumento de tipo -
Integer neste caso - para a prpria
classe Caixa.
Tipo de parmetro e tipo
Argumento Terminologia: Muitos
desenvolvedores usam os termos
"tipo de parmetro" e "argumento de
tipo" como sinnimos, mas esses
termos no so a mesma coisa.
Quando a codificao, um fornece
argumentos de tipo, a fim de criar
um tipo parametrizado. Portanto,
o T em Foo <T> um parmetro de
tipo e a sequencia em Foo <String>
f um argumento de tipo. Esta lio
observa essa definio ao usar
esses termos.

Como qualquer outra declarao de
varivel, este cdigo no realmente
criar um novo objeto de Caixa. Ele
simplesmente declara
que integerBox vai realizar uma
referncia a
uma "Caixa de Integer", que
como Box <Integer> lido.
Uma chamada de um tipo genrico
geralmente conhecido como
um tipo parametrizado.
Para instanciar essa classe, use a
palavra-chave new, como de
costume, mas
colocar <Integer> entre o nome da
classe e o parntese:
Box <Integer> integerBox = new
Box <Integer> ();
The Diamond
Em Java SE 7 e, mais tarde, voc
pode substituir os argumentos de
tipo necessrios para invocar o
construtor de uma classe genrica
com um conjunto vazio de
argumentos de tipo (<>), desde que
o compilador pode determinar ou
inferir, os argumentos de tipo de
contexto . Este par de colchetes, <>,

informalmente chamado de diamant
e, por exemplo, voc pode criar
uma instncia de Box
<Integer> com a seguinte
declarao:
Box <Integer> integerBox = new
Box <> ();
Para mais informaes sobre a
notao de diamante e inferncia de
tipos, consulte Inferncia de tipos .
Mltipla tipo Parmetros
Como mencionado anteriormente,
uma classe genrica pode ter vrios
parmetros de tipo. Por exemplo, a
classe OrderedPair genrico, que
implementa a interface de
genrico Par:
interface pblica Par <K, V> {
pblico K getKey ();
pblico V getValue ();
}

public class OrderedPair <K, V>
implementa Par <K, V> {

chave K privado;
valor V privado;

OrderedPair pblica (chave K,
valor V) {
this.key = chave;
this.value = value;
}

pblico K getKey () {return
chave; }
pblico V getValue () {valor de
retorno; }
}
As declaraes a seguir cria duas
instncias da classe OrderedPair:
P1 Par <String, Integer> = new
OrderedPair <String, Integer>
("Even", 8);
P2 Par <String, String = new
OrderedPair <String, String ("Ol",
"mundo");
O cdigo, novo OrderedPair <String,
Integer>, instancia K como
uma String e V como
um Integer. Portanto, os tipos de
parmetro de
construtor OrderedPair 's
so String e Integer, respectivament
e. Devido a autoboxing , vlido
passar um String e um int para a
classe.
Como mencionado no The
Diamond , porque um compilador
Java possa inferir os tipos K e V da
declarao OrderedPair <String,
Integer>, estas declaraes podem
ser encurtadas usando a notao de
diamante:
OrderedPair <String, Integer> p1 =
new OrderedPair <> ("Even", 8);
OrderedPair <String, String> p2 =
new OrderedPair <> ("Ol",
"mundo");
Para criar uma interface genrica,
siga as mesmas convenes como
para a criao de uma classe
genrica.
Tipos parametrizados
Voc tambm pode substituir um
parmetro de tipo (ou seja, V K ou)
com um tipo parametrizado (ou
seja, Lista <String>). Por exemplo,
usando o exemplo OrderedPair <K,
V>:
OrderedPair <String, Box
<Integer>> p = new OrderedPair <>
("primos", novo Box <Integer> (...));

Tipos crus
Um tipo de matria o nome de
uma classe genrica ou interface
sem quaisquer argumentos de
tipo. Por exemplo, dada a
classe Caixa genrica:
public class Box <T> {
public void set (T t) {/ * ... * /}
/ / ...
}
Para criar um tipo parametrizado
de Box <T>, voc fornece um
argumento de tipo real para o tipo
de parmetro formal T:
Box <Integer> intBox = new Box <>
();
Se o argumento tipo real for omitido,
voc criar um tipo de matria
de Box <T>:
Box rawBox = new Box ();
Portanto, Box o tipo cru do tipo
genrico Box <T>. No entanto, uma
classe ou tipo de interface no-
genrico no um tipo cru.
Tipos primas aparecem em cdigo
legado porque muitas classes de
API (como as
classes Colees) no foram
genricas antes JDK 5.0. Ao usar
tipos crus, voc essencialmente
obter o comportamento pr-
genricos uma caixa d-
lhe objetos s. Para compatibilidade
com verses anteriores, a atribuio
de um tipo parametrizado para seu
tipo cru permitido:
Box <String> stringBox = new Box
<> ();
Box rawBox = stringBox; / / OK
Mas se voc atribuir um tipo de cru
para um tipo parametrizado, voc
recebe um aviso:
Box rawBox = new Box (); / /
RawBox um tipo de matria-Box
<T>
Box <Integer> intBox = rawBox; / /
Aviso: converso desmarcada
Voc tambm recebe um aviso, se
voc usar um tipo de matria e
invoca mtodos genricos definidos
no tipo genrico correspondente:
Box <String> stringBox = new Box
<> ();
Box rawBox = stringBox;
rawBox.set (8); / / Aviso: invocao
desmarcada para definir (T)
O alerta mostra que tipos de
matrias e ignora as verificaes de
tipo genrico, adiando a captura de
cdigo no seguro para a
execuo. Portanto, voc deve
evitar o uso de tipos de matrias.
O Erasure Tipo seo tem mais
informaes sobre como o
compilador Java usa tipos de
matrias.
Mtodos genricos
Mtodos genricos so mtodos
que apresentam os seus prprios
parmetros de tipo. Isto
semelhante ao declarar um tipo
genrico, mas o mbito do
parmetro tipo limitada ao mtodo
em que declarada.Mtodos
genricos estticos e no-estticos
so permitidos, bem como
construtores de classe genricos.
A sintaxe para um mtodo genrico
inclui um parmetro de tipo, dentro
de colchetes, e aparece antes do
tipo de retorno do mtodo. Para
mtodos genricos estticos, a
seo de tipo de parmetro deve
aparecer antes tipo de retorno do
mtodo.
A classe Util inclui um mtodo
genrico, compare, que compara
dois objetos par:
public class Util {
/ / Mtodo esttico genrico
estticos boolean <K, V>
pblicas comparar (p1 Par <K, V>,
Par <K, V> p2) {
voltar p1.getKey (). equals
(p2.getKey ()) &&
. p1.getValue () igual a
(p2.getValue ());
}
}

public class Par <K, V> {

chave K privado;
valor V privado;

/ / Construtor genrico
Par pblica (chave K, valor V) {
this.key = chave;
this.value = value;
}

/ / mtodos genricos
public void setKey (tecla K)
{this.key = chave; }
setValue public void (valor V)
{this.value = value; }
pblico K getKey () {return
chave; }
pblico V getValue () {valor de
retorno; }
}
A sintaxe completa para invocar
este mtodo seria:
P1 Par <Integer, String = new Par
<> (1, "ma");
P2 Par <Integer, String = new Par
<> (2, "pera");
. boolean mesmo = Util <Integer,
String comparar (p1, p2);
O tipo foi expressamente previsto,
como mostrado em
negrito. Geralmente, isso pode ser
deixado de fora e o compilador ir
inferir o tipo que necessrio:
P1 Par <Integer, String = new Par
<> (1, "ma");
P2 Par <Integer, String = new Par
<> (2, "pera");
booleano mesmo Util.compare =
(p1, p2);

Concluso
O presente estudo abordou
um tema bastante presente na
programao sobre o Generics em
Java, que veio com a inteno de
ajudar o programador a evitar o
desperdcio de tempo verificaes
mais rpidas aumentando assim
sua produtividade ao utiliza-lo.

Referencias Bibliogrficas
Lanhellas, Ronaldo. Usando Generics em java. Disponvel em
<http://www.devmedia.com.br/usando-generics-em-java/28981> Acessado em:
31 mai. 2014
The Java Tutorials. Disponvel em
<http://docs.oracle.com/javase/tutorial/java/generics/types.html> Acessando
em: 31 mai. 2014