java generics-basics

27
http://publicationslist.org/junio Java Generics Prof. Jose Fernando Rodrigues Junior http://www.icmc.usp.br/~junio [email protected] INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO - USP - SCC0504 - Programação Orientada a Objetos

Upload: jose-f-rodrigues-jr

Post on 08-Jun-2015

412 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: 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

Page 2: Java generics-basics

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?

Page 3: Java generics-basics

http://publicationslist.org/junio

Exemplo de uma classe simples com parâmetro T

Exemplo NetBeans - SimpleGenericClass

Page 4: Java generics-basics

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

Page 5: Java generics-basics

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");

Page 6: Java generics-basics

http://publicationslist.org/junio

Exemplo - Pair

Page 7: Java generics-basics

http://publicationslist.org/junio

Exemplo - Pair

Page 8: Java generics-basics

http://publicationslist.org/junio

Exemplo - Pair

Exemplo NetBeans - Pair

Page 9: Java generics-basics

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 …

Page 10: Java generics-basics

http://publicationslist.org/junio

Tipos primitivos embutidos - exemplo

Page 11: Java generics-basics

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 +

Page 12: Java generics-basics

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 +

}}

Page 13: Java generics-basics

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)

}}

Page 14: Java generics-basics

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

Page 15: Java generics-basics

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

Page 16: Java generics-basics

http://publicationslist.org/junio

Múltiplos parâmetros - exemplo

Page 17: Java generics-basics

http://publicationslist.org/junio

Múltiplos parâmetros

Page 18: Java generics-basics

http://publicationslist.org/junio

Múltiplos parâmetros

Page 19: Java generics-basics

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”

Page 20: Java generics-basics

http://publicationslist.org/junio

Exemplo – interface Comparable

Exemplo NetBeans PairComparable

Page 21: Java generics-basics

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

Page 22: Java generics-basics

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

Page 23: Java generics-basics

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

Page 24: Java generics-basics

http://publicationslist.org/junio

Herança com classes genéricas

Page 25: Java generics-basics

http://publicationslist.org/junio

Herança com classes genéricas

Exemplo NetBeans UnorderedPair

Page 26: Java generics-basics

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

Page 27: Java generics-basics

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