Tipos genéricos (cont)

Documentos relacionados
Tipos genéricos (cont)

TrabalhadorEstudante te(123, Ana, Faro, feminino, 100.0, 22); Estudante e=te; //ok Estudante *pe = &te; //ok Estudante &se = te; //ok

TIPOS PARAMETRIZADOS CLASSES GENÉRICAS PARTE II

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

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

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

Java Collections Framework II

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

Interfaces POO. Prof. Marcio Delamaro

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

Streams II. Overview. The notion of stream Java I/O stream hierarchy Files, and file access using streams Serialization

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

A Relação de Subtipo e Tipos Genéricos

9 Classes Abstractas e Interfaces

Polimorfismo. O que é polimorfismo?

Programação por Objectos. Java

Profa. Thienne Johnson EACH/USP

Introdução. LP OO desenvolvida pela Sun no início da década de 90 com sintaxe semelhente a C\C++. C C++.

Java para Desktop. Programação Orientada à Objetos 2 JSE

Programação Orientada a Objetos com Java. Prof. Júlio Machado

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Computação II Orientação a Objetos

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

Programação Java. - Herança e Polimorfismo - Marco Fagundes Marco Fagundes -

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Tipos, Literais, Operadores

Tipos, Literais, Operadores

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

Computação II - Java - Teste 1.2 Prof. Adriano Joaquim de Oliveira Cruz 2015/04/27

Lição 11 Herança, polimorfismo e interfaces

Rafael B. Pereira (

Programação com genéricos

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Java Collections Framework III

Interfaces e Classes Internas

Especificam quem tem acesso a cada entidade, isto é, quem tem acesso a. cada classe e cada membro da classe (dados e métodos)

Métodos Genéricos. Prof.: Michele Nasu Tomiyama Bucci

Programação Orientada a Objetos. Polimorfismo

Herança e Polimorfismo (Universal)

Errors and exceptions

12 Tipos Genéricos. Desenvolvimento OO com Java. Vítor E. Silva Souza

A B Classe Genérica D A C. Classe Especializada. Classe Especializada. Características Herdadas

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

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

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Ex: carro_desportivo poderá ser uma subclasse de automóvel (carro_desportivo é_um automóvel)

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

Classe Abstrata e Interface

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Polimorfismo e Acoplamento Dinâmico

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

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Herança; Sobrescrita, Sobrecarga e Polimorfismo; Classes abstratas e concretas (finais).

Binding and Casting. Bruce Eckel, Thinking in Java, 4th edition, PrenticeHall, New Jersey, cf.

INTERFACES DE JAVA. O JCF é uma arquitectura que se baseia em três entidades fundamentais:

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

Generics - Java. Fernando Santos. Programação Orientada a Objetos

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Aula 10 Polimorfismo. Prof. Jefersson Alex dos Santos. Baseado em:

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

Programação Orientada por Objectos 2010/11. 2º Exame 28 de Junho de 2011

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Conceitos de Interface; classes abstratas; Diagrama de sequencia, Diagrama de atividades, classes aninhadas e Listas dinâmicas

Paradigmas da Programação PPROG GENÉRICOS. (Livro Big Java, Late Objects Capítulo 18) Nelson Freire (ISEP DEI-PPROG 2014/15) 1/23

[Desenvolvimento OO com Java] Classes abstratas e interfaces

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Interfaces. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Java 2 Standard Edition Classes internas

Linguagem de Programação II Implementação

PROGRAMAÇÃO JAVA. Parte 3

Programação Orientada a Objetos

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

Herança. Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman SISTEMAS DE INFORMAÇÃO 1

Avançando em Java com Polimorfismo. Prof.: Hugo Barros

GENÉRICOS EM JAVA. Java Generics

Como exemplo, vamos criar uma subclasse da classe Funcionario, vista nos capítulos anteriores.

AULA 8 Polimorfismo de: coerção, overloading, inclusão e paramétrico Prof. Dr. Fernando Henrique Campos

Iteradores. Iteradores. Isabel Harb Manssour. Roteiro. Coleções

Interfaces. Classes abstratas que possuem apenas métodos abstratos. Na Interface: Métodos são implicitamente. Campos são implicitamente

Prof. Fernando V. Paulovich 8 de novembro de SCC Programação Orientada a Objetos

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

4 Conceito de Herança

package especificadores1; public class Alpha { public static void alphapublic(){ System.out.println("Alpha public!"); }

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Programação Orientada a Objetos

Atividade 08 - Utilizando Collections - List

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Coleções. Prof. Marcelo Roberto Zorzan

Desenvolvimento OO com Java Classes abstratas e interfaces

POO29004 Programação Orientada a Objetos

// quando o estado do Sujeito muda

Análise e Projeto Orientados por Objetos

Aula 9 Herança. Prof. Jefersson Alex dos Santos

Transcrição:

Tipos genéricos (cont) Bruce Eckel, Thinking in Java, 4th edition, PrenticeHall, New Jersey, cf. http://mindview.net/books/tij4 Gilad Bracha, Generics in the Java Programming Language a.k.a The Generics Tutorial, Julho de 2004 cf. http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf jvo@ualg.pt José Valente de Oliveira 18-1 Aula de substituíção da próxima semana jvo@ualg.pt José Valente de Oliveira 16-2 1

Sumário Noções chave Definição e utilização de tipos genéricos Hierarquias de subtipos Tipos com limites Especificação UML Métodos genéricos Desenvolvimento de tipos genéricos: O quicksort revisitado Rasura Polimorfismo revisitado jvo@ualg.pt José Valente de Oliveira 18-3 Tipos com limites Limite superior: <? extends T> Aceita T e todos os seus descendentes Ex: se T for Number, aceita também Integer, Float, Double Limite inferior: <? super T> Aceita T e todos os seus ascendentes Ex: se T for Integer, aceita também Number e Object jvo@ualg.pt José Valente de Oliveira 18-4 2

Generic type hierachy Desenvolvimento de tipos genéricos jvo@ualg.pt José Valente de Oliveira 18-6 3

class Point class Point { private int x, y; public Point(int ax, int ay) { class Point { x=ax; private double x, y; y=ay; public Point(double ax, double ay) { x=ax; public int getx() { return x; y=ay; public int gety() { return y; public double getx() { return x; public double dist(point p) { public double gety() { return y; int dx = x p.getx(); int dy = y p.gety(); public double dist(point p) { return Math.sqrt(dx*dx+dy*dy); double dx = x p.getx(); double dy = y p.gety(); return Math.sqrt(dx*dx+dy*dy); O que nós gostaríamos: Point<Integer> pi = new Point<Integer>(1, 2); Point<Double> pd = new Point<Double>(1.3, 2.4); jvo@ualg.pt José Valente de Oliveira 16-8 4

class Point como um tipo genérico class Point<T extends Number> { private T x, y; public Point(T ax, T ay) { x=ax; y=ay; public T getx() { return x; public T gety() { return y; public double dist(point p) { T dx = x p.getx(); T dy = y p.gety(); return Math.sqrt(dx*dx+dy*dy); Recalling quicksort jvo@ualg.pt José Valente de Oliveira 18-10 5

Anteriormente @SuppressWarnings( unchecked ) abstract class Quicksort { private Comparable[] data; /** pré-generics **/ interface Comparable { int compareto(object o); public final void quicksort(comparable[] d) { data = d; quicksort(0, data.length-1); /** quicksort method as the template method */ private final void quicksort(int left, int right) { if (right <= left) return; int i = partition(left, right); quicksort(left, i-1); quicksort(i+1, right); jvo@ualg.pt José Valente de Oliveira 18-11 O que gostaríamos public class Main { public static void main(string[] args) { List<Fraction> lst = new ArrayList<Fraction>(); lst.add(new Fraction(1, 7)); lst.add(new Fraction(5, 2)); lst.add(new Fraction(1, 2)); GQuicksort<Fraction> qs = new ProbQuickSort<Fraction>(); qs.quicksort(lst); for(fraction f: lst) System.out.println (f); jvo@ualg.pt José Valente de Oliveira 18-12 6

O quicksort revisitado public abstract class GQuicksort<T extends Comparable<T>> { private List<T> data; public final void quicksort(list<t> d) { data = d; quicksort(0, data.size()-1); private final void quicksort(int left, int right) { if (right <= left) return; int i = partition(left, right); quicksort(left, i-1); quicksort(i+1, right); jvo@ualg.pt José Valente de Oliveira 18-13 Anteriormente /** Call this in a subclass for swaping elements i and j */ protected final void exchange(int i, int j) { Comparable tmp = data[i]; data[i] = data[j]; data[j] = tmp; /** Use this in subclasses to compare elements x.compareto(y) answer 0 if x ==y; -1 if x < y; 1 se x>y */ protected final boolean less(int i, int j) { return (data[i].compareto(data[j]) < 0); jvo@ualg.pt José Valente de Oliveira 18-14 7

O quicksort revisitado protected final void exchange(int i, int j) { T tmp = data.get(i); data.set(i, data.get(j)); data.set(j, tmp); protected final boolean less(int i, int j) { T di = data.get(i); T dj = data.get(j); return (di.compareto(dj) < 0); jvo@ualg.pt José Valente de Oliveira 18-15 Antes class ProbQuickSort extends Quicksort { @Override protected int partition(int left, int right) { int last=left; int pp = left + (int) (Math.random() * (right-left)); // pivot position exchange(left, pp); for(int i=left+1; i <= right; i++) if (less(i, left)) exchange(i, ++last); exchange(left, last); return last; jvo@ualg.pt José Valente de Oliveira 18-16 8

O quicksort revisitado class GProbQuickort<T extends Comparable<T>> extends GQuicksort<T> { protected int partition(int left, int right) { int last=left; int pp = left + (int) (Math.random() * (right-left)); // pivot position exchange(left, pp); for(int i=left+1; i <= right; i++) if (less(i, left)) exchange(i, ++last); exchange(left, last); return last; jvo@ualg.pt José Valente de Oliveira 18-17 Será que podemos usar esta classe antiga /** a pre-generics version */ class Fraction implements Comparable { private int num, den; // public int compareto (Object o) { // /** pré-generics **/ interface Comparable { int compareto(object o); jvo@ualg.pt José Valente de Oliveira 18-18 9

neste cliente? public class Main { public static void main(string[] args) { List<Fraction> lst = new ArrayList<Fraction>(); lst.add(new Fraction(1, 7)); lst.add(new Fraction(5, 2)); lst.add(new Fraction(1, 2)); GQuicksort<Fraction> qs = new ProbQuickSort<Fraction>(); qs.quicksort(lst); for(fraction f: lst) System.out.println (f); jvo@ualg.pt José Valente de Oliveira 18-19 Vejamos public abstract class GQuicksort<T extends Comparable<T>> { private List<T> data; // protected final boolean less(int i, int j) { T di = data.get(i); T dj = data.get(j); return (di.compareto(dj) < 0); jvo@ualg.pt José Valente de Oliveira 18-20 10

Recorda-se que /** pré-generics **/ interface Comparable { int compareto(object o); /** actualmente **/ interface Comparable<T> { int compareto(t t); jvo@ualg.pt José Valente de Oliveira 18-21 Relembremos /** a pre-generics version */ class Fraction implements Comparable { private int num, den; // public int compareto (Object o) { // jvo@ualg.pt José Valente de Oliveira 18-22 11

e se fizermos estas alterações? public abstract class GQuicksort<T extends Comparable<? super T>> { private List<T> data; // class GProbQuickort<T extends Comparable<? super T>> extends GQuicksort<T> { // jvo@ualg.pt José Valente de Oliveira 18-23 Rasura (Erasure) jvo@ualg.pt José Valente de Oliveira 18-24 12

Rasura (erasure) O compilador rasura toda a informação relativa ao parâmetro formal de tipo na classe compilada A classe fonte ArrayList<T> é na classe compilada apenas ArrayList T é na classe compilada: Object, quando se encontra num contexto <T> (Object é a superclasse implícita de T). Number, quando se encontra num contexto <T extends Number>(Number é a superclasse explícita de T). jvo@ualg.pt José Valente de Oliveira 18-25 Rasura (erasure) 13

Rasura (erasure) Rasura (erasure) A rasura faz com que, em tempo de execução, não se possa usar nada que necessite do conhecimento do parâmetro formal. 1. Não é possível usar o parâmetro tipo T para criar objectos nem para criar tabelas. 14

Rasura (erasure) jvo@ualg.pt José Valente de Oliveira 18-29 Solução típica jvo@ualg.pt José Valente de Oliveira 18-30 15

Cliente jvo@ualg.pt José Valente de Oliveira 18-31 Rasura (erasure) 2. Não é possível criar tabelas cujos elementos sejam tipos parametrizados. 16

Rasura (erasure) 3. Não é possível usar instanceof para verificar se um objecto é uma instância de um tipo parametrizado. Rasura (erasure) 4. Os casts envolvendo tipos genéricos ou parâmetros formais de tipo são substituídos por casts para as rasuras respectivas. 17

Rasura (erasure) 5. Não é possível aceder a membros estáticos de um tipo parametrizado: public class MyCollection<E> implements Collections<E> { //... public static int MAX_SIZE; MyCollection<Integer>.MAX_SIZE; // ERROR! MyCollection.MAX_SIZE; Polimorfismo revisitado jvo@ualg.pt José Valente de Oliveira 18-36 18

Polimorfismo revisitado jvo@ualg.pt José Valente de Oliveira 18-37 Polimorfismo ad-hoc coercitivo jvo@ualg.pt José Valente de Oliveira 18-38 19

Polimorfismo ad-hoc sobrecarga jvo@ualg.pt José Valente de Oliveira 18-39 Polimorfismo universal paramétrico jvo@ualg.pt José Valente de Oliveira 18-40 20

Polimorfismo universal de inclusão jvo@ualg.pt José Valente de Oliveira 18-41 Check point Qual é o valor lógico escrito no ecrã? List<String> l1 = new ArrayList<String> (); List<Integer> l2 = new ArrayList<Integer> (); System.out.println(l1.getClass() == l2.getclass()); 21

Check point Serão válidas as expressões seguintes? List<Integer> l1 = new ArrayList<Integer> (); List<Number> l2 = new ArrayList<Number> (); l2 = l1; l2.add(1); Sumário Noções chave Definição e utilização de tipos genéricos Hierarquias de subtipos Tipos com limites Especificação UML Métodos genéricos O quicksort revisitado Rasura Polimorfismo revisitado jvo@ualg.pt José Valente de Oliveira 18-44 22