Download - Java generics-basics
http://publicationslist.org/junio
Java GenericsProf. Jose Fernando Rodrigues Junior
http://www.icmc.usp.br/[email protected]
INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO - USP -
SCC0504 - Programação Orientada a Objetos
http://publicationslist.org/junio
Introdução A partir da versão 5.0, a linguagem Java passou a
suportar classes parametrizadas, ou Generics, umrecurso semelhante às templates de C++
Um exemplo é a classe ArrayList Quais tipos de objetos ela deve armazenar?
http://publicationslist.org/junio
Exemplo de uma classe simples com parâmetro T
Exemplo NetBeans - SimpleGenericClass
http://publicationslist.org/junio
A classe Sample é denominada “classe genérica”ou “parametrizada”
Os parâmetros devem ser incluídos dentro de colchetesangulares após o nome da classe
Qualquer palavra não-chave pode ser usada, mas porconvenção, o parâmetro começa com uma letra maiúscula
Os parâmetros, então, são usados ao longo da classe
Exemplo de uma classe simples com parâmetro T
http://publicationslist.org/junio
Sintaxe A sintaxe em colchetes angulares não é usada dentro do corpo da
classe
public Sample<T>()
Para a definição acima, por exemplo, o construtor seria:
public Sample(T umDado)
No entanto, quando uma instância de uma classeparametriza é criada, a sintaxe é necessária
Pair<String> pair = new Pair<STring>(“Mario", “Prado");
http://publicationslist.org/junio
Exemplo - Pair
http://publicationslist.org/junio
Exemplo - Pair
http://publicationslist.org/junio
Exemplo - Pair
Exemplo NetBeans - Pair
http://publicationslist.org/junio
Tipos
Classes parametrizadas não podem recebertipos primitivos como parâmetros como int edouble
Para o uso destes tipos, a compilação Java provêautomaticamente tipos embutidos int new Integer double new Double …
http://publicationslist.org/junio
Tipos primitivos embutidos - exemplo
http://publicationslist.org/junio
Exemplo soma O seguinte exemplo não funciona:public class SimpleGenericClass <C extends java.lang.Double> {
private C dado;private C dado2;
public void setDado(C dado) {this.dado = dado;
}public void setDado2(C dado) {
this.dado2 = dado;}
public C getSum(){
return dado + dado2; Erro}
}
Funcionaria em C, mas não funciona em Java pois Java não suportasobrecarga de operadores, no caso o operador +
http://publicationslist.org/junio
Exemplo soma O seguinte exemplo não funciona:public class SimpleGenericClass <C extends java.lang.Double> {
private C dado;private C dado2;
public void setDado(C dado) {this.dado = dado;
}public void setDado2(C dado) {
this.dado2 = dado;}
public C getSum(){
return dado + dado2; Erro: o compilador não sabe se o tipo Cpossui o operador +
}}
http://publicationslist.org/junio
Exemplo soma O seguinte exemplo não funciona:public class SimpleGenericClass <C extends java.lang.Double> {
private C dado;private C dado2;
public void setDado(C dado) {this.dado = dado;
}public void setDado2(C dado) {
this.dado2 = dado;}
public C getSum(){return dado. doubleValue() + dado2. doubleValue();
Erro: agora o compilador sabe, mas agora o tipo deretorno é diferente de C (todo C é Double, mas nemtodo Double é C)
}}
http://publicationslist.org/junio
Exemplo soma O seguinte exemplo não funciona:public class SimpleGenericClass <C extends java.lang.Double> {
private C dado;private C dado2;
public void setDado(C dado) {this.dado = dado;
}public void setDado2(C dado) {
this.dado2 = dado;}
public java.lang.Double getSum(){return dado. doubleValue() + dado2. doubleValue();
} Agora funciona}
Conclusão: o Java Generics é bem menos versátil do que o C++ template, especialmente emoperações aritméticas
http://publicationslist.org/junio
Uma classe genérica pode ter qualquer númerode parâmetros A sintaxe é a mesma, basta separar os parâmetros
por vírgulas
Múltiplos parâmetros
http://publicationslist.org/junio
Múltiplos parâmetros - exemplo
http://publicationslist.org/junio
Múltiplos parâmetros
http://publicationslist.org/junio
Múltiplos parâmetros
http://publicationslist.org/junio
Limitantes para os parâmetros Para se trabalhar com um tipo “desconhecido” faz todo o
sentido saber pelo menos do que esse tipo é capaz Para isso, é possível 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 implementeum dada interface, por exemplo:
Para garantir que uma classe genérica seja serializável, pode-serequerer a interface Serializable:
public class ClasseExemplo<T extends Serializable>
Obs.: nesta sintaxe não se usa a palavra chave “implements”
http://publicationslist.org/junio
Exemplo – interface Comparable
Exemplo NetBeans PairComparable
http://publicationslist.org/junio
Métodos Genéricos Também é possível trabalhar com métodos
genéricos, independentemente da classe sergenérica ou não – em ambos os casos, osparâmetros do método são independentes
Mesmo que a classe não receba parâmetro, seusmétodos podem receber
Mesmo em uma classe que recebe parâmetros, osparâmetros dos métodos podem ser diferentes dosda classe
http://publicationslist.org/junio
Sintaxe da definição de um método genérico
public <U> void MetodoGenerico(U a)
Sintaxe do uso de um método genérico
String c = “teste”;UmaClasse umaClasse = new UmaClasse();umaClasse.<String>MetodoGenerico(c);
Métodos Genéricos
http://publicationslist.org/junio
Herança com classes genéricas Classes genéricas podem ser usadas em
herança como qualquer outra, podendo herdarde classes não genéricas ou genéricas
Importante noção: Dada uma classe genérica G<T> Dadas duas classes quaisquer A e B
G<A> não tem qualquer relação com G<B>; sãoclasses diferentes
http://publicationslist.org/junio
Herança com classes genéricas
http://publicationslist.org/junio
Herança com classes genéricas
Exemplo NetBeans UnorderedPair
http://publicationslist.org/junio
Limitações Os parâmetros de uma classe não são flexíveis
como o identificador de uma classe convencional Especificamente, um tipo parâmetro não pode ser
usado em expressões new dentro da própriaclasse parametrizadapublic class PClass<T>{public Pclass( ){
T object = new T();T[] a = new T[10];Pair<String>[] a = new Pair<String>[10];
}}Nenhuma destas expressões é válida
http://publicationslist.org/junio
Opção de compilação Xlint
A programação com Generics pode se tornarcomplicada, pois há um nível extra de cognição
Uma maneira de se trabalhar com os problemasencontrados é aumentar o nível de detalhamentodas mensagens do compilador javac
javac –Xlint Sample.java