Programação de Computadores II TCC 00.174 Prof.: Leandro A. F. Fernandes www.ic.uff.br/~laffernandes Conteúdo: Material elaborado pelos profs. Anselmo Montenegro e Marcos Lage com contribuições do prof. Leandro A. F. Fernandes Estudo de caso LinkedList animais = new LinkedList(); ArrayStack frutas = new ArrayStack(); animais.insertatback( new Fruta("Laranja") ); // OK frutas.push( new Animal("Macaco") ); // OK Animal animal = (Animal) animais.removefromback(); // ERRO DE EXECUÇÃO Fruta fruta = (Fruta)frutas.pop(); // ERRO DE EXECUÇÃO 2012.1 Programação de Computadores II 2 1
Alternativa LinkedList<Animal> animais = new LinkedList<Animal>(); ArrayStack<Fruta> frutas = new ArrayStack<Fruta>(); animais.insertatback(new Fruta("Laranja )); //ERRO DE EXECUÇÃO frutas.push(new Animal("Macaco )); //ERRO DE EXECUÇÃO Animal animal = animais.removefromback(); // OK Fruta fruta = (Fruta)frutas.pop(); // OK 2012.1 Programação de Computadores II 3 Vantagens Simplicidade: Não é necessário Type Casting (conversão de tipo) para extrair os objetos das coleções Robustez: O compilador não permite colocar na coleção elementos incompatíveis com os tipos declarados 2012.1 Programação de Computadores II 4 2
Definição Um tipo genérico (generic type) é um tipo que possui um ou mais parâmetros de tipo. public interface List<E> { void insertatback(e element); E removefromback(); public class Stack<E> implements Lista<E> { void push(e element); E pop(); 2012.1 Programação de Computadores II 5 Parâmetros Os parâmetros de tipo de um tipo genérico podem ser ou não limitados. O limite de um parâmetro de tipo restringe os tipos que podem ser usados como argumento. O parâmetro de tipo limitado dá acesso aos métodos do tipo limite. 2012.1 Programação de Computadores II 6 3
Tipos Ilimitados class Pair<X,Y> { private X first; private Y second; public Pair(X a1, Y a2) { first = a1; second = a2; public X getfirst() { return first; public Y getsecond() { return second; public void setfirst(x arg) { first = arg; public void setsecond(y arg) { second = arg; 2012.1 Programação de Computadores II 7 Tipos com limite class Pair<A extends Animal, B extends Fruta> {. 2012.1 Programação de Computadores II 8 4
Instanciando Um tipo parametrizado (parametrized type) é a instanciação de um tipo genérico usando argumentos de tipo. Exs.: List<String> list1 = new ArrayList<String>(); List<Integer> list2 = new Stack<Integer>(); 2012.1 Programação de Computadores II 9 Subtipos O código abaixo está correto? List<String> ls = new ArrayList<String>(); List<Object> lo = ls; 2012.1 Programação de Computadores II 10 5
Subtipos O código abaixo está correto? Se sim podemos fazer List<String> ls = new ArrayList<String>(); List<Object> lo = ls; lo.add(new Integer(5)); 2012.1 Programação de Computadores II 11 Subtipos O código abaixo está correto? E ainda List<String> ls = new ArrayList<String>(); List<Object> lo = ls; lo.add(new Integer(5)); String s = ls.get(0); // ERRO!!! 2012.1 Programação de Computadores II 12 6
Subtipos List<String> não é subtipo de List<Object>!!!! List<String> ls = new ArrayList<String>(); List<Object> lo = ls; // ERRO DE COMPILAÇÃO Se o tipo F ésub tipo de B e G éum tipo genérico Então G<F> não é subtipo de G<B> 2012.1 Programação de Computadores II 13 Arrays Nãosepodeusararrayscujascomponentessejam tipos parametrizados: Pair<String,String>[] arr = null; // OK arr = new Pair<String,String>[2]; // ERRO DE COMPILAÇÃO Pair[] arrayofpair = new Pair[2]; // OK arrayofpair[0] = new Pair<String, String>(); // OK Pair<String, String> first = arrayofpair[0]; // UNCHECKED WARNING 2012.1 Programação de Computadores II 14 7
Arrays // UNCHECKED WARNING O compilador não possui as informações disponíveis para fazer a verificação de tipo 2012.1 Programação de Computadores II 15 Alternativas a Arrays class DictionaryRegister extends Pair<String,String> { DictionaryRegister[] arr = new DictionaryRegister [2]; // OK 2012.1 Programação de Computadores II 16 8
Alternativas a Arrays List<Pair<String,String>> list = new LinkedList < Pair<String,String> >(); 2012.1 Programação de Computadores II 17 Exercícios Escrever uma classe: Ponto2D<E> { Ex; Ey; 2012.1 Programação de Computadores II 18 9
Exercícios Escrever as interfaces: List<E>, Stack<E> e Queue<E> 2012.1 Programação de Computadores II 19 Exercícios Escrever as subclasses: LinkedList<E>, LinkedStack<E> e LinkedQueue<E> 2012.1 Programação de Computadores II 20 10