A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Java Generics Adeline de Sousa Silva. Por que Generics? Maior facilidade de desenvolvimento Maior robustez Cria classes type-safe Evita o uso extensivo.

Apresentações semelhantes


Apresentação em tema: "Java Generics Adeline de Sousa Silva. Por que Generics? Maior facilidade de desenvolvimento Maior robustez Cria classes type-safe Evita o uso extensivo."— Transcrição da apresentação:

1 Java Generics Adeline de Sousa Silva

2 Por que Generics? Maior facilidade de desenvolvimento Maior robustez Cria classes type-safe Evita o uso extensivo de type casts e instanceof

3 O mundo sem Generics... public class Pilha { private Vector elements new Vector(); public Object pop() { Object result = null; result = this.elements.removeElementAt(0); return result; } public void push(Object obj) { this.elements.insertElementAt(obj, 0); } public class Pilha { private Vector elements new Vector(); public Object pop() { Object result = null; result = this.elements.removeElementAt(0); return result; } public void push(Object obj) { this.elements.insertElementAt(obj, 0); } Definição do tipo Pilha

4 Usando o tipo Pilha public class PilhaExpressoes { private Pilha pilha = new Pilha(); public Expressao pop() { result = (Expressao)this.pilha.pop(); return result; } public void push(Expressao p) { this.pilha.push(p); } public class PilhaExpressoes { private Pilha pilha = new Pilha(); public Expressao pop() { result = (Expressao)this.pilha.pop(); return result; } public void push(Expressao p) { this.pilha.push(p); } Uso obrigatório de casts, mesmo sabendo que só existem objetos do tipo Expressa na pilha replicação de código Uso do tipo

5 E com generics... public class Pilha { private Vector elements new Vector (); public T pop() { return this.elements.removeElementAt(0); } public void push(T obj) { this.elements.insertElementAt(obj, 0); } public class Pilha { private Vector elements new Vector (); public T pop() { return this.elements.removeElementAt(0); } public void push(T obj) { this.elements.insertElementAt(obj, 0); } Pilha pilhaExpressoes = new Pilha ();

6 Definindo tipos genéricos Para definir uma classe genérica, basta alterar o identificador da classe, para incluir o elemento de tipagem modificadores class NomeDaClasse modificadores class NomeDaClasse [extends SuperClasse ] implements [lista de interfaces] { corpoDaClasse corpoDaClasse} modificadores class NomeDaClasse modificadores class NomeDaClasse [extends SuperClasse ] implements [lista de interfaces] { corpoDaClasse corpoDaClasse} Aqui fica o especificador de tipo

7 Genéricos e subtipos Veja este trecho de código: List listString = new ArrayList (); List listObject = listString; List listString = new ArrayList (); List listObject = listString; Este código aparentemente está ok, mas com genéricos, isso não é verdade! Atenção: Dizer que A estende B, não significa que List extends List !!!

8 void printCollection(Collection c){ for (int i = 0; i< c.size(); i++){ for (int i = 0; i< c.size(); i++){ System.out.println(c.get(i)); System.out.println(c.get(i)); }} void printCollection(Collection c){ for (int i = 0; i< c.size(); i++){ for (int i = 0; i< c.size(); i++){ System.out.println(c.get(i)); System.out.println(c.get(i)); }} Definindo curingas Imagine que você quer definir uma método que aceite uma coleção de qualquer tipo de objetos void printCollection(Collection c){ for (Object obj: c){ for (Object obj: c){ System.out.println(obj); System.out.println(obj); }} void printCollection(Collection c){ for (Object obj: c){ for (Object obj: c){ System.out.println(obj); System.out.println(obj); }} Atenção: Collection não é o pai de todas as coleções!!! Atenção: Collection não é o pai de todas as coleções!!! Java < 1.5 Java 1.5

9 Curingas A solução neste caso, seria colocar um “?” Indicando que você não conhece, a priori, o tipo da coleção. void printCollection(Collection c){ for (Object obj: c){ System.out.println(obj); } void printCollection(Collection c){ for (Object obj: c){ System.out.println(obj); }

10 Potenciais problemas class classGenerica { void metodoGenerico(T obj){ obj.iterator(); } class classGenerica { void metodoGenerico(T obj){ obj.iterator(); } E se o tipo T não definir um método iterator?

11 Pode-se definir restrições sobre os tipos! class classGenerica { void metodoGenerico(T obj){ obj.iterator(); } class classGenerica { void metodoGenerico(T obj){ obj.iterator(); } Agora, o tipo T tem de ser do tipo Collection

12 Conclusão Generics é um recurso poderoso, que permite maior robustez e elegância no código Java, porém, é preciso ter cuidado ao usar o recurso!


Carregar ppt "Java Generics Adeline de Sousa Silva. Por que Generics? Maior facilidade de desenvolvimento Maior robustez Cria classes type-safe Evita o uso extensivo."

Apresentações semelhantes


Anúncios Google