Programação Orientada a Objetos em



Documentos relacionados
Coleções. Page 1. Coleções. Prof. Anderson Augustinho Uniandrade

Laboratório de Programação. Aula 13 Java 5COP088. Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr barbon@uel.

Coleções Avançadas. Programação Orientada a Objetos Java. Prof. Anselmo Cardoso Paiva Prof. Geraldo Braz Junior

Bruce Eckel, Thinking in Java, 4th edition, PrenticeHall, New Jersey, cf. José Valente de Oliveira 16-1

TCC Prof.: Leandro A. F. Fernandes Conteúdo: Tipos Genéricos

Técnicas de Programação Avançada TCC Prof.: Anselmo Montenegro

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br)

BSI UFRPE Prof. Gustavo Callou

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

Rafael Santos. Instituto Nacional de Pesquisas Espaciais rafael.santos. Rafael Santos - rafael.

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Cartão de fidelização de clientes das distribuidoras de combustível.

Java Coleções. Rodrigo C. de Azevedo

Exercícios de Revisão Java Básico

5. Generics, Iterators e Comparable em Java. Tipos de Dados Abstractos Generics em Java

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Programação Java. em Ambiente Distribuído. Ênfase no Mapeamento Objeto-Relacional com JPA, EJB e Hibernate. Douglas Rocha Mendes.

Java Básico. Classes Abstratas, Exceções e Interfaces Prof. Fernando Vanini Ic-Unicamp

Encapsulamento de Dados

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Objetivo do programa: Implementação de um analisador de Logs do Servidor Web com base nos requisitos da unidade curricular de Estatística.

5 Caso de estudo O cartão fidelidade

Módulo 06 Desenho de Classes

Interface Collection. Coleções em Java Collections Genéricos em Java - Generics. Interface Collection

Guia de Fatores de Qualidade de OO e Java

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Slide 1 Deitel/Deitel, 8e. Java Como programar Copyright 2010 Pearson Education

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

Lista encadeada class No { Coleções. Enumeration. Lista encadeada (continuação) Enumeration Exemplo usando a classe Lista anterior

Programação Orientada a Objetos. Encapsulamento

Java. Marcio de Carvalho Victorino

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

ÇÃO COM OBJECTOS PROGRAMAÇÃ. Programação com Objectos. Programação com Objectos TUDO É UM OBJECTO TUDO É UM OBJECTO ÍNDICE.

Curso Java Starter. 1

Programação Orientada a Objetos em java. Polimorfismo

Programação de Computadores - I. Profª Beatriz Profº Israel

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

UNIVERSIDADE FEDERAL DO PARANÁ

insfcanceof new public switch transient while byte continue extends for int null

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Unidade IV: Ponteiros, Referências e Arrays

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

A Linguagem Java. Alberto Costa Neto DComp - UFS

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

Construção de novas Classes em Java. Classes Atributos Métodos Herança...

8 Classes Internas. Desenvolvimento OO com Java. Vítor E. Silva Souza

Coleções. Prof. Marcelo Roberto Zorzan

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Técnicas de Programação II

Programação por Objectos. Java

Técnicas de Programação Avançada TCC Profs.: Anselmo Montenegro

2 Orientação a objetos na prática

Programação Orientada a Objetos em Java. Herança

Programação II Java Streams. Christopher Burrows

Templates e Pilhas. 1. Introdução

Reuso com Herança a e Composiçã

Sintaxe Básica de Java Parte 1

Prototype, um Design Patterns de Criação

BC0501 Linguagens de Programação

Java 2 Standard Edition Como criar classes e objetos

Capítulo 4. Packages e interfaces

Programação Orientada por Objetos

Programação online em Java

BC0505 Processamento da Informação

Vetores. Professor Dr Francisco Isidro Massettto

POO Programação Orientada a Objetos. Classes em Java

Programação por Objectos. Java

Programação Orientada a Objetos em Java

Módulo 07 Características Avançadas de Classes

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento NetBeans Introdução à Linguagem de Programação JAVA

Tipos, Literais, Operadores

Tipos, Literais, Operadores

AULA DE JAVA 1 - CONCEITOS BÁSICOS

Tabelas (arrays) (vetores, matrizes, etc) Algoritmos de pesquisa Algoritmos de ordenação

3 Classes e instanciação de objectos (em Java)

Programação por Objectos. Java

Exercício 1 : As classes abaixo serão utilizadas neste exercício: public class Ponto { int x; int y; public Ponto(int x, int y){ this.

Interfaces. Interfaces: Exemplo. ! São um mecanismo poderoso para ter bons desenhos pois permitem separar contratos das implementações

Paradigmas de Programação

Algoritmos e Programação II. Sobrecarga

Roteiro 1: Dados, variáveis, operadores e precedência

JSP - ORIENTADO A OBJETOS

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

ESQUEMA AULA PRÁTICA 1 Familiarização com o Ambiente de Desenvolvimento Eclipse Introdução à Linguagem de Programação JAVA

Padrão Básico de Projeto: Interfaces e Polimorfismo

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

Orientação a Objetos e a Linguagem Java

TIPOS PARAMETRIZADOS CLASSES GENÉRICAS PARTE II

Transcrição:

Programação Orientada a Objetos em Flávio Miguel Varejão UFES

Utilidades Pacotes com várias classes amplamente utilizadas Exemplos Vector, ArrayList, Calendar, Currency, Random, Formatter, Scanner, Comparator, Iterator, Enumeration, Properties, StringTokenizer Utilidades 2

Coleções Uma coleção representa um grupo de objetos (chamados elementos) em um único objeto Também conhecidos como containers Infraestrutura de coleções incluem Interfaces Permitem a manipulação de diferentes coleções independentemente dos detalhes de representação Implementações Implementações de estruturas de dados amplamente utilizadas Algoritmos Utilidades Métodos úteis Departamento para várias de Informática coleções, como sort e search 3

Coleções Algumas Vantagens Redução no esforço de programação Programador pode se concentrar na funcionalidade desejada em vez de se preocupar com a implementação de estruturas de dados Melhoria do desempenho e qualidade Implementação das coleções têm alto desempenho e qualidade Aumenta interoperabilidade de programas Diferentes implementações de coleções podem ser usadas em um mesmo trecho Utilidades de código Departamento sem necessidade de Informática de código de adaptação ou conversão 4

Coleções Algumas das interfaces que fazem parte da infraestrutura de coleções Collection Grupo de objetos com ordem não especificada Duplicação permitida List Grupo de objetos ordenados Pode haver duplicação Set Grupo de objetos não ordenados Utilidades Sem duplicação 5

Coleções Algumas das interfaces que fazem parte da infraestrutura de coleções Map Grupo de pares (chave, valor) de objetos Mapeamentos podem ser heterogêneos Tanto chave quanto valor podem ser de tipo definido arbitrariamente Sem duplicação de chave Uma chave só pode ter um valor Mesmo valor pode ser associado a várias chaves Utilidades 6

Coleções Collection Map List Set HashMap TreeMap ArrayList LinkedList HashSet TreeSet Utilidades 7

Listas public class Listas { public static void main(string[] args) { ArrayList pares = new ArrayList(); LinkedList impares = new LinkedList(); for(int i = 0; i < 10; i = i + 2) pares.add(new Integer(i)); pares.add(new String("pares")); for(int i = 1; i < 10; i = i + 2) impares.add(new Integer(i)); impares.add(new Float(3.14)); for(int i = 0; i < pares.size(); i++) { System.out.println(pares.get(i)); Utilidades 8

Listas for(int i = 0; i < impares.size(); i++) { System.out.println(impares.get(i)); Integer j = (Integer) pares.get(0); //! Integer j = (Integer) pares.get(5); Integer k = (Integer) impares.get(0); //! Integer k = (Integer) impares.get(5); Utilidades 9

Listas class ListaInteiros { private ArrayList v = new ArrayList(); public void add(integer i) { v.add(i); public Integer get(int ind) { return (Integer)v.get(ind); public int size() { return v.size(); public static void main(string[] args) { ListaInteiros inteiros = new ListaInteiros (); for(int i = 0; i < 3; i++) inteiros.add(new Integer(i)); for(int i = 0; i < inteiros.size(); i++) System.out.println(inteiros.get(i)); Utilidades 10

Iteradores Iteração é o processo pelo qual uma coleção é percorrida e todos os seus elementos são acessados Iteração sobre conjuntos é não determinística Iteração sobre listas pode ser na sequência ou na sequência invertida Utilidades 11

Iteradores // Iterador.java import java.util.*; public class Iterador { static void imprimetodos(iterator e) { while(e.hasnext()) System.out.println(e.next()); public static void main(string[] args) { List inteiros = new ArrayList(); for(int i = 0; i < 7; i++) inteiros.add(new Integer(i)); Iterator iterador = inteiros.iterator(); imprimetodos(iterador); ///:~ Utilidades 12

Novo for no J2SE 5.0 Uso de iteradores se tornou amplo e disseminado Fazer iteração sobre uma coleção é pouco redigível Problema se agravaria com a inclusão de generics Solução foi criar uma nova alternativa de comando for Utilidades 13

Novo for no J2SE 5.0 ArrayList lista = new ArrayList(); Lista.add(new Integer(1)); Lista.add(new Integer(2)); Lista.add(new Integer(3)); for (Iterator i = lista.iterator(); i.hasnext();) { Integer value =(Integer)i.next(); for (Object i: lista) { Integer value = (Integer) i; Utilidades 14

Novo for no J2SE 5.0 int soma(int[] a) { int resultado = 0; for (int i : a){ resultado += i; return resultado; Utilidades 15

Conjuntos import java.util.*; class Colecao { public static Collection preenche(collection c) { for(int i = 0; i < 10; i++) c.add(integer.tostring(i)); return c; public static void imprime(collection c) { for(iterator x = c.iterator(); x.hasnext();) System.out.print(x.next() + " "); System.out.println(); Utilidades 16

Conjuntos public class Conjuntos { public static void testa(set a) { Colecao.preenche(a); Colecao.preenche(a); Colecao.preenche(a); Colecao.imprime(a); // Nao ha' duplicidade a.addall(a); a.add("um"); a.add("um"); a.add("um"); Colecao.imprime(a); System.out.println("a contém \"um\": " + a.contains("um")); public static void main(string[] args) { testa(new HashSet()); testa(new TreeSet()); Utilidades 17

Mapeamentos import java.util.*; public class Mapas { public static void main(string[] args) { Map conta_pal_mapa = new HashMap(); ArquivoTexto leitor = new Arquivotexto(args[0]); Iterator palavras = new IteradorPalavras(leitor); while ( palavras.hasnext() ) { String pal = (String) palavras.next(); String pal_min = pal.tolowercase(); // esta é a chave Integer freq = (Integer) cont_pal_mapa.get(pal_min); Utilidades 18

Mapeamentos if (freq == null) { freq = new Integer(1); else { int valor = freq.intvalue(); freq = new Integer(valor + 1); cont_pal_mapa.put(pal_min, freq); System.out.println(conta_pal_mapa); Utilidades 19

Propriedades É um mapeamento no qual chave e valor são Strings Muito usada com aplicações baseadas em XML Uso da classe Properties com um arquivo de configurações permite manter a aplicação sem a necessidade de recompilar o código fonte a cada mudança nas configurações Arquivos com extensão.properties Uso de método load() 20

Arquivo de Configuração #Configurações do arquivo mail.properties mail.pop3.host=pop.dot.com mail.debug=false mail.from=from_user@mail.dot.com mail.user=to_user mail.smtp.host=smtp.dot.com mail.store.protocol=pop3 Utilidades 21

Leitura do Arquivo File file = new File("mail.properties"); Properties props = new Properties(); FileInputStream fis = null; try { fis = new FileOutputStream(file); //lê os dados que estão no arquivo props.load(fis); fis.close(0; catch (IOException ex) { System.out.println(ex.getMessage()); ex.printstacktrace(); Utilidades 22

Manipulando Propriedades String user = props.getproperty("mail.user"); String from = props.getproperty("mail.from"); String smtp = props.getproperty("mail.smtp.host"); String pop3 = props.getproperty("mail.pop3.host"); String protocol = props.getproperty("mail.store.protocol"); String debug = props.getproperty("mail.debug"); String user = "guj"; props.setproperty("mail.user", user); Utilidades 23

Atualizando Arquivo File file = new File("mail.properties"); FileInputStream fos = null; try { fos = new FileOutputStream(file); //grava os dados no arquivo props.store(fos, "Configurações do arquivo mail.properties"); fos.close(); catch (IOException ex) { System.out.println(ex.getMessage()); ex.printstacktrace(); Utilidades 24

Propriedades do Sistema import java.util.*; public class TestaPropriedades { public static void main(string[] args) { Properties props = System.getProperties(); Enumeration nomes_prop = props.propertynames(); while (nomes_prop.hasmoreelements() ) { String nome_propriedade = (String) nomes_prop.nextelement(); String propriedade = props.getproperty(nome_propriedade); System.out.println( propriedade + nome_propriedade + é + propriedade + ); Utilidades 25

Enumerações no J2SE 5.0 Uso de constantes para a representação de tipos enumerados public static final int INVERNO = 0; public static final int PRIMAVERA = 1; public static final int VERAO = 2; public static final int OUTONO = 3; Problemas Não é seguro: é possível passar qualquer valor inteiro quando uma estação é necessária Os valores não são informativos: São impressos números, o que não diz nada a respeito do que representam ou do tipo que pertencem Utilidades 26

Enumerações no J2SE 5.0 Tipos enumerados foram incorporados a linguagem no J2SE Não pertencem a pacote util enum ESTACAO {INVERNO, PRIMAVERA, VERAO, OUTONO A declaração enum define uma nova classe É possível adicionar métodos e campos a um tipo enumerado e implementar interfaces Tipos enumerados possuem implementações dos métodos da classe Object e podem 27 ser Utilidades

Enumerações no J2SE 5.0 import java.util.*; public class Carteado { public enum Cartas { DOIS, TRÊS, QUATRO, CINCO, SEIS, SETE, OITO, NOVE, DEZ, VALETE, RAINHA, REI, AS public enum Naipes { PAUS, OUROS, COPAS, ESPADAS private final Cartas carta; private final Naipes naipe; private Carteado(Cartas carta, Naipes naipe) { this.carta = carta; this.naipe = naipe; public Cartas carta() { return carta; public Naipes naipe() { return naipe; Utilidades 28

Enumerações no J2SE 5.0 public String tostring() { return carta + " of " + naipe; private static final List baralho = new ArrayList(); static { for (Naipes naipe : Naipes.values()) for (Cartas carta : Cartas.values()) baralho.add(new Carteado(carta, naipe)); public static ArrayList novobaralho() { return new ArrayList (novobaralho); Utilidades 29

Enumerações no J2SE 5.0 public enum Planeta { MERCURIO (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), TERRA (5.976e+24, 6.37814e6), MARTE (6.421e+23, 3.3972e6), JUPITER (1.9e+27, 7.1492e7), SATURNO (5.688e+26, 6.0268e7), URANO (8.686e+25, 2.5559e7), NETUNO (1.024e+26, 2.4746e7), PLUTAO (1.27e+22, 1.137e6); private final double massa; private final double raio; Planeta(double massa, double raio) { this.massa = massa; this.raio = raio; Utilidades 30

Enumerações no J2SE 5.0 public static final double G = 6.67300E-11; double gravidadesuperficie() { return G * massa / (raio * raio); double pesosuperficie(double outramassa) { return outramassa * gravidadesuperficie(); Utilidades 31

Enumerações no J2SE 5.0 public class UsaEnum { public static void main(string[] args) { double pesoterra = double.parsedouble(args[0]); double massa = pesoterra/terra.gravidadesuperficie(); for (Planeta p: Planeta.values()){ System.out.printf("Seu peso em %s eh %f%n", p, p.pesosuperficie(massa)); Utilidades 32

Java Generics no J2SE 5.0 Polimorfismo paramétrico Código genérico que pode ser aplicado a diferentes tipos de dados Listas Tipos parametrizados Tipo é um parâmetro para o código Permite eliminar a necessidade de downcast na maior parte das situações Evita a inclusão de elementos de tipos inadequados na compilação Generics 33

Java Generics Sem tipos parametrizados List myintlist = new LinkedList(); myintlist.add(new Integer(0)); Integer x = (Integer) myintlist.iterator().next(); Com tipos parametrizados List<Integer> myintlist = new LinkedList<Integer>(); myintlist.add(new Integer(0)); Integer x = myintlist.iterator().next(); Generics 34

Definição de Generics public interface List<E> { void add(e x); Iterator<E> iterator(); public interface Iterator<E> { E next(); boolean hasnext(); Generics 35

Generics e Subtipos Tipo do elemento não é levado em conta na hierarquia de classes List<String> ls = new ArrayList<String>(); List<Object> lo = ls; // nao e permitido... lo.add(new Object()); String s = ls.get(0); Generics 36

Generics e Código Polimórfico Antes de J2SE 5.0 void printcollection(collection c) { Iterator i = c.iterator(); for (k = 0; k < c.size(); k++) { System.out.println(i.next()); Generics 37

Generics e Código Polimórfico Generics restringiria Deixa de ser polimórfico Só coleções de objetos void printcollection(collection<object> c) { for (Object e: c) { System.out.println(e); Generics 38

Generics e Código Polimórfico Generics com wildcards (coringas) Restaura polimorfismo void printcollection(collection<?> c) { for (Object e: c) { System.out.println(e); Código com wildcards não permitem a adição de elementos Collection<?> c = new ArrayList<String>(); c.add(new Object()); // erro em tempo de compilação Generics 39

Wildcards Wildcards podem ser muito amplos public abstract class Forma { public abstract void desenhar(); public class Circulo extends Forma { private int x, y, raio; public void desenhar() { System.out.println( Circulo ); public class Retangulo extends Forma { private int x, y, largura, altura; public void desenhar() { System.out.println( Forma ); Generics 40

Wildcards Limitados Sem wildcards não funciona como desejado public void desenhatudo(list<forma> formas) { for (Forma f: formas) { f.desenhar(); Com wildcards permite o uso com listas de qualquer tipo de elemento public void desenhatudo(list<?> formas) { for (Object f: formas) { ((Forma) f).desenhar(); Generics 41

Wildcards Limitados Só funciona com lista de forma ou suas subclasses public void desenhatudo(list<? extends Forma> formas){... Não é possível adicionar elementos public void addretangulo(list<? extends Forma> formas) { formas.add(0, new Retangulo()); // erro em // tempo de compilação poderia ser circulo Generics 42

Métodos Genéricos Não é possível adicionar elementos static void fromarraytocollection(object[] a, Collection<?> c) { for (Object o : a) { c.add(o); // erro de compilação Coleção de objetos pode ser usada, mas perde verificação em tempo de compilação static void fromarraytocollection(object[] a, Collection<Object> c) { for (Object o : a) { c.add(o); Generics 43

Métodos Genéricos Usar parâmetros tipo em métodos genéricos static <T> void fromarraytocollection(t[] a, for (T o : a) { c.add(o); // correto! Collection<T> c) { Generics 44

Métodos Genéricos Object[] oa = new Object[100]; Collection<Object> co = new ArrayList<Object>(); fromarraytocollection(oa, co);// T como Object String[] sa = new String[100]; Collection<String> cs = new ArrayList<String>(); fromarraytocollection(sa, cs);// T como String fromarraytocollection(sa, co);// T como Object Integer[] ia = new Integer[100]; Float[] fa = new Float[100]; Number[] na = new Number[100]; Collection<Number> cn = new ArrayList<Number>(); fromarraytocollection(ia, cn);// T como Number fromarraytocollection(fa, cn);// T como Number fromarraytocollection(na, cn);// T como Number fromarraytocollection(na, co);// T como Object fromarraytocollection(na, cs);// erro de compilação Generics 45

Métodos Genéricos e Wildcards Wildcards podem ser usados em métodos genéricos class Collections { public static <T> void copy(list<t> dest, List<? extends T> src){... Generics 46

Classes Genéricas public class Lista <E> { private class No <E> { E info; No<E> prox; No (E o) { info = o; prox = null; No <E> prim, marc; int tam; Generics 47

Classes Genéricas public Lista() { prim = marc = null; tam = 0; public void inicio() { marc = prim; public E proximo () { No<E> q = marc; if (marc!= null) marc = marc.prox; return q.info; Generics 48

Classes Genéricas public void inclui (E o) { No <E> p = prim, q = prim, n = new No<E>(o); while (p!= null) { q = p; p = p.prox; if (q == null) { prim = n; else { q.prox = n; tam++; Generics 49

Descarte de Tipo Implementação de código genérico T vira limite superior genérico Em geral vira Object Info adicional para compilação de código usuário Uso de código genérico Introdução de casts apropriados e métodos ponte Generics 50

Descarte de Tipo Implementação antes da compilação public class Pair<X,Y> { private X first; private Y second; public Pair(X x, Y y) { first = x; second = y; public X getfirst() { return first; public Y getsecond() { return second; public void setfirst(x x) { first = x; public void setsecond(y y) { second = y; Generics 51

Descarte de Tipo Implementação após a compilação public class Pair { private Object first; private Object second; public Pair (Object x, Object y) { first = x; second = y; public Object getfirst() { return first; public Object getsecond() { return second; public void setfirst (Object x) { first = x; public void setsecond (Object y) { second = Generics y; 52

Descarte de Tipo Uso antes da compilação public class Test { public static void main(string[] args) { Pair<String,Long> pair = new Pair<String,Long>("limit", 10000L); String s = pair.getfirst(); Long l = pair.getsecond(); Object o = pair.getsecond(); Generics 53

Descarte de Tipo Uso após a compilação public class Test { public static void main(string[] args) { Pair pair = new Pair("limit", 10000L); String s = (String) pair.getfirst(); Long l = (Long) pair.getseond(); Object o = pair.getsecond(); Generics 54

Descarte de Tipo Antes da compilação interface Comparable <A> { public int compareto( A that); final class NumericValue implements Comparable <NumericValue> { private byte value; public NumericValue (byte value) { this.value = value; public byte getvalue() { return value; public int compareto(numericvalue that) { return this.value - that.value; Generics 55

Descarte de Tipo Após compilação interface Comparable { public int compareto (Object that); final class NumericValue implements Comparable { private byte value; public NumericValue (byte value) { this.value = value; public byte getvalue() { return value; public int compareto( NumericValue that) { return this.value - that.value; public int compareto(object that) { //método ponte Generics return this.compareto((numericvalue)that); 56

Vetores e Generics Não é possível criar vetores genéricos public class Grupo <T> { private T [] p; private int tam = 0; private int marc = -1; Grupo () { p = new T [5]; Grupo (int n) {... Generics p = new T [n]; // erro de compilação // erro de compilação 57

Vetores e Generics Poderia provocar violação no sistema de tipos Object[] objarr = new String[10]; // permitido objarr[0] = new String(); objarr[1] = new Long(0L); // ArrayStoreException Pair<Integer,Integer>[] intpairarr = new Pair<Integer,Integer>[10]; // ilegal Object[] objarr = intpairarr; Generics objarr[0] = new Departamento Pair<String,String>("",""); de Informática // aceitaria 58

Generics e Código Legado Código legado package br.com.morteindolor.coisas; public interface Parte {... public class Inventario { public static void addinstrumento(string nome, Collection partes) {... public static Instrumento getinstrumento( String nome) {... public interface Instrumento { Collection getpartes(); //Retorna coleção de //partes Generics 59

Generics e Código Legado Código genérico usando código legado package br.com.minhaempresa.inventario; import br.com.morteindolor.coisas.*; public class Lamina implements Parte {... public class Suporte implements Parte {... public class Main { public static void main(string[] args) { Collection<Parte> c = new ArrayList<Parte>(); c.add(new Suporte()) ; c.add(new Lamina()); Inventario.addInstrumento( Guilhotina, c); Collection<Parte> k = Inventario.getInstrumento( Guilhotina ).getpartes(); Generics 60

Generics e Código Legado Gera alerta de operação não verificada na compilação Pode provocar erro em tempo de execução public String brecha(integer x) { List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // alerta não verificado return ys.iterator().next(); //ClassCastException Generics 61

Generics e Código Legado Código genérico package br.com.morteindolor.coisas; public interface Parte {... public class Inventario { public static void addinstrumento(string nome, Collection<Parte> partes) {... public static Instrumento getinstrumento( String nome) {... public interface Instrumento { Collection<Parte> getparts(); Generics 62

Generics e Código Legado Código legado usando código genérico package com.minhaempresa.inventario; import br.com.morteindolor.coisas.*; public class Lamina implements Parte {... public class Guilhotina implements Parte { public class Main { public static void main(string[] args) { Collection c = new ArrayList(); c.add(new Guilhotina()) ; c.add(new Lamina()); Inventario.addInstrumento( Guilhotina, c); // 1 Collection k = Inventario.getInstrumento( Guilhotina ).getpartes(); Generics 63 Alerta de operação Universidade não Federal verificada do em //1

Detalhes de Generics List <String> l1 = new ArrayList<String>(); List<Integer> l2 = new ArrayList<Integer>(); System.out.println(l1.getClass() == l2.getclass()); Collection cs = new ArrayList<String>(); if (cs instanceof Collection<String>) {... // ilegal Collection<String> cstr = (Collection<String>) cs; // alerta de não verificado <T> T badcast(t t, Object o) { return (T) o; // alerta de não verificado Generics 64