O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
Java13
Java13
Carregando em…3
×

Confira estes a seguir

1 de 27 Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Semelhante a Java generics-basics (20)

Anúncio

Mais de Universidade de São Paulo (20)

Java generics-basics

  1. 1. http://publicationslist.org/junio Java Generics Prof. Jose Fernando Rodrigues Junior http://www.icmc.usp.br/~junio junio@icmc.usp.br INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO - USP - SCC0504 - Programação Orientada a Objetos
  2. 2. http://publicationslist.org/junio Introdução  A partir da versão 5.0, a linguagem Java passou a suportar classes parametrizadas, ou Generics, um recurso semelhante às templates de C++  Um exemplo é a classe ArrayList  Quais tipos de objetos ela deve armazenar?
  3. 3. http://publicationslist.org/junio Exemplo de uma classe simples com parâmetro T  Exemplo NetBeans - SimpleGenericClass
  4. 4. http://publicationslist.org/junio  A classe Sample é denominada “classe genérica” ou “parametrizada”  Os parâmetros devem ser incluídos dentro de colchetes angulares após o nome da classe  Qualquer palavra não-chave pode ser usada, mas por convençã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
  5. 5. 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 classe parametriza é criada, a sintaxe é necessária Pair<String> pair = new Pair<STring>(“Mario", “Prado");
  6. 6. http://publicationslist.org/junio Exemplo - Pair
  7. 7. http://publicationslist.org/junio Exemplo - Pair
  8. 8. http://publicationslist.org/junio Exemplo - Pair  Exemplo NetBeans - Pair
  9. 9. http://publicationslist.org/junio Tipos  Classes parametrizadas não podem receber tipos primitivos como parâmetros como int e double  Para o uso destes tipos, a compilação Java provê automaticamente tipos embutidos  int  new Integer  double  new Double  …
  10. 10. http://publicationslist.org/junio Tipos primitivos embutidos - exemplo
  11. 11. 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 suporta sobrecarga de operadores, no caso o operador +
  12. 12. 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 C possui o operador + } }
  13. 13. 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 de retorno é diferente de C (todo C é Double, mas nem todo Double é C) } }
  14. 14. 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 em operações aritméticas
  15. 15. http://publicationslist.org/junio  Uma classe genérica pode ter qualquer número de parâmetros  A sintaxe é a mesma, basta separar os parâmetros por vírgulas Múltiplos parâmetros
  16. 16. http://publicationslist.org/junio Múltiplos parâmetros - exemplo
  17. 17. http://publicationslist.org/junio Múltiplos parâmetros
  18. 18. http://publicationslist.org/junio Múltiplos parâmetros
  19. 19. 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 implemente um dada interface, por exemplo:  Para garantir que uma classe genérica seja serializável, pode-se requerer a interface Serializable: public class ClasseExemplo<T extends Serializable> Obs.: nesta sintaxe não se usa a palavra chave “implements”
  20. 20. http://publicationslist.org/junio Exemplo – interface Comparable Exemplo NetBeans  PairComparable
  21. 21. http://publicationslist.org/junio Métodos Genéricos  Também é possível trabalhar com métodos genéricos, independentemente da classe ser genérica ou não – em ambos os casos, os parâmetros do método são independentes  Mesmo que a classe não receba parâmetro, seus métodos podem receber  Mesmo em uma classe que recebe parâmetros, os parâmetros dos métodos podem ser diferentes dos da classe
  22. 22. 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
  23. 23. http://publicationslist.org/junio Herança com classes genéricas  Classes genéricas podem ser usadas em herança como qualquer outra, podendo herdar de 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ão classes diferentes
  24. 24. http://publicationslist.org/junio Herança com classes genéricas
  25. 25. http://publicationslist.org/junio Herança com classes genéricas Exemplo NetBeans  UnorderedPair
  26. 26. 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ópria classe parametrizada public 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
  27. 27. http://publicationslist.org/junio Opção de compilação Xlint  A programação com Generics pode se tornar complicada, pois há um nível extra de cognição  Uma maneira de se trabalhar com os problemas encontrados é aumentar o nível de detalhamento das mensagens do compilador javac javac –Xlint Sample.java

×