Você está na página 1de 13

Mdulo 2

Introduo Programao II

Lio 13
Introduo Generics

Verso 1.0 - Mar/2007

JEDITM

Autor Rebecca Ong Equipe Joyce Avestro Florence Balagtas Rommel Feria Rebecca Ong John Paul Petines Sun Microsystems Sun Philippines

Necessidades para os Exerccios

Sistemas Operacionais Suportados NetBeans IDE 5.5 para os seguintes sistemas operacionais: Microsoft Windows XP Profissional SP2 ou superior Mac OS X 10.4.5 ou superior Red Hat Fedora Core 3 Solaris 10 Operating System (SPARC e x86/x64 Platform Edition) NetBeans Enterprise Pack, poder ser executado nas seguintes plataformas: Microsoft Windows 2000 Profissional SP4 Solaris 8 OS (SPARC e x86/x64 Platform Edition) e Solaris 9 OS (SPARC e x86/x64 Platform Edition) Vrias outras distribuies Linux Configurao Mnima de Hardware Nota: IDE NetBeans com resoluo de tela em 1024x768 pixel Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 500 MHz Intel Pentium III workstation ou equivalente 500 MHz Intel Pentium III workstation ou equivalente UltraSPARC II 450 MHz AMD Opteron 100 Srie 1.8 GHz PowerPC G4 Memria 512 MB 512 MB 512 MB 512 MB 512 MB HD Livre 850 MB 450 MB 450 MB 450 MB 450 MB

Configurao Recomendada de Hardware Sistema Operacional Microsoft Windows Linux Solaris OS (SPARC) Solaris OS (x86/x64 Platform Edition) Mac OS X Processador 1.4 GHz Intel Pentium III workstation ou equivalente 1.4 GHz Intel Pentium III workstation ou equivalente UltraSPARC IIIi 1 GHz AMD Opteron 100 Series 1.8 GHz PowerPC G5 Memria 1 GB 1 GB 1 GB 1 GB 1 GB HD Livre 1 GB 850 MB 850 MB 850 MB 850 MB

Requerimentos de Software NetBeans Enterprise Pack 5.5 executando sobre Java 2 Platform Standard Edition Development Kit 5.0 ou superior (JDK 5.0, verso 1.5.0_01 ou superior), contemplando a Java Runtime Environment, ferramentas de desenvolvimento para compilar, depurar, e executar aplicaes escritas em linguagem Java. Sun Java System Application Server Platform Edition 9. Para Solaris, Windows, e Linux, os arquivos da JDK podem ser obtidos para sua plataforma em http://java.sun.com/j2se/1.5.0/download.html Para Mac OS X, Java 2 Plataform Standard Edition (J2SE) 5.0 Release 4, pode ser obtida diretamente da Apple's Developer Connection, no endereo: http://developer.apple.com/java ( necessrio registrar o download da JDK). Para mais informaes: http://www.netbeans.org/community/releases/55/relnotes.html

Introduo Programao II

JEDITM

Colaboradores que auxiliaram no processo de traduo e reviso


Alexandre Mori Alexis da Rocha Silva Aline Sabbatini da Silva Alves Allan Wojcik da Silva Andr Luiz Moreira Andro Mrcio Correa Louredo Antoniele de Assis Lima Antonio Jose R. Alves Ramos Aurlio Soares Neto Bruno da Silva Bonfim Bruno dos Santos Miranda Bruno Ferreira Rodrigues Carlos Alberto Vitorino de Almeida Carlos Alexandre de Sene Carlos Andr Noronha de Sousa Carlos Eduardo Veras Neves Cleber Ferreira de Sousa Cleyton Artur Soares Urani Cristiano Borges Ferreira Cristiano de Siqueira Pires Derlon Vandri Aliendres Fabiano Eduardo de Oliveira Fbio Bombonato Fernando Antonio Mota Trinta Flvio Alves Gomes Francisco das Chagas Francisco Marcio da Silva Gilson Moreno Costa Givailson de Souza Neves Gustavo Henrique Castellano Hebert Julio Gonalves de Paula Heraldo Conceio Domingues Hugo Leonardo Malheiros Ferreira Ivan Nascimento Fonseca Jacqueline Susann Barbosa Jader de Carvalho Belarmino Joo Aurlio Telles da Rocha Joo Paulo Cirino Silva de Novais Joo Vianney Barrozo Costa Jos Augusto Martins Nieviadonski Jos Leonardo Borges de Melo Jos Ricardo Carneiro Kleberth Bezerra G. dos Santos Lafaiete de S Guimares Leandro Silva de Morais Leonardo Leopoldo do Nascimento Leonardo Pereira dos Santos Leonardo Rangel de Melo Filardi Lucas Mauricio Castro e Martins Luciana Rocha de Oliveira Lus Carlos Andr Lus Octvio Jorge V. Lima Luiz Fernandes de Oliveira Junior Luiz Victor de Andrade Lima Manoel Cotts de Queiroz Marcello Sandi Pinheiro Marcelo Ortolan Pazzetto Marco Aurlio Martins Bessa Marcos Vinicius de Toledo Maria Carolina Ferreira da Silva Massimiliano Giroldi Mauricio Azevedo Gamarra Mauricio da Silva Marinho Mauro Cardoso Mortoni Mauro Regis de Sousa Lima Namor de S e Silva Nres Chaves Rebouas Nolyanne Peixoto Brasil Vieira Paulo Afonso Corra Paulo Jos Lemos Costa Paulo Oliveira Sampaio Reis Pedro Antonio Pereira Miranda Pedro Henrique Pereira de Andrade Renato Alves Flix Renato Barbosa da Silva Reyderson Magela dos Reis Ricardo Ferreira Rodrigues Ricardo Ulrich Bomfim Robson de Oliveira Cunha Rodrigo Pereira Machado Rodrigo Rosa Miranda Corra Rodrigo Vaez Ronie Dotzlaw Rosely Moreira de Jesus Seire Pareja Sergio Pomerancblum Silvio Sznifer Suzana da Costa Oliveira Tsio Vasconcelos da Silveira Thiago Magela Rodrigues Dias Tiago Gimenez Ribeiro Vanderlei Carvalho Rodrigues Pinto Vanessa dos Santos Almeida Vast Mendes da Silva Rocha Wagner Eliezer Roncoletta

Auxiliadores especiais
Reviso Geral do texto para os seguintes Pases:
Brasil Tiago Flach Guin Bissau Alfredo C, Bunene Sisse e Buon Olossato Quebi ONG Asas de Socorro

Coordenao do DFJUG
Daniel deOliveira JUGLeader responsvel pelos acordos de parcerias Luci Campos - Idealizadora do DFJUG responsvel pelo apoio social Fernando Anselmo - Coordenador responsvel pelo processo de traduo e reviso, disponibilizao dos materiais e insero de novos mdulos Regina Mariani - Coordenadora responsvel pela parte jurdica Rodrigo Nunes - Coordenador responsvel pela parte multimdia Srgio Gomes Veloso - Coordenador responsvel pelo ambiente JEDITM (Moodle)

Agradecimento Especial
John Paul Petines Criador da Iniciativa JEDITM Rommel Feria Criador da Iniciativa JEDITM

Introduo Programao II

JEDITM

1. Objetivos
A verso 5 do Java trouxe grandes avanos na programao. Inclui extenses significantes sintaxe da linguagem. A mais visvel delas foi a adio de Generics. Nessa lio iremos conhecer os conceitos bsicos relacionados a Generics. Ao final desta lio, o estudante ser capaz de:

Enumerar os benefcios de Generics Declarar classes utilizando Generics Utilizar Generics limitados Declarar mtodos utilizando Generics Usar colees Java com Generics

Introduo Programao II

JEDITM

2. Por que Generics?


Um dos maiores problemas na linguagem de programao Java a necessidade constante de fazer typecast ou casting (converses de tipo explcitas) em expresses para tipos de dados mais especficos do que seus tipos estticos. Por exemplo, um objeto ArrayList permite adicionarmos objetos de qualquer tipo de referncia coleo, mas quando recuperarmos estes elementos, precisaremos fazer um typecast nos objetos para o tipo de referncia especfico nossa necessidade. O casting um perigo em potencial para gerar uma ClassCastException. Ele tambm torna nossos cdigos mais poludos e, portanto, menos legveis. Alm disso, o casting efetivamente destri os benefcios de uma linguagem com os tipos fortemente definidos, uma vez que anula a segurana trazida pela checagem embutida de tipos. O principal objetivo da adio de Generics ao Java solucionar este problema. Tipos Generics permite que uma nica classe trabalhe com uma grande variedade de tipos. Eles so uma forma natural de se eliminar a necessidade do cast. Primeiro iremos considerar um objeto ArrayList e ver como os tipos Generics ajudariam a melhorar nosso cdigo. Um objeto ArrayList possui a capacidade de armazenar elementos de qualquer tipo de referncia em uma coleo de objetos. Uma instncia de ArrayList, entretanto, sempre fora a realizar um casting nos objetos que recuperamos da coleo. Considere a seguinte linha de instruo: String myString = (String) myArrayList.get(0); A verso utilizando Generics, da classe ArrayList foi desenvolvida para trabalhar nativamente com qualquer tipo de classe. Ao mesmo tempo, ela tambm preserva os benefcios da checagem de tipos. Podemos eliminar a necessidade do casting no elemento que obtemos da coleo e ter a seguinte linha de instruo: String myString = myArrayList.get(0); Embora o casting j tenha sido removido, isso no significa que possamos atribuir qualquer tipo ao valor de retorno do mtodo get e eliminar o casting tambm. Ao atribuir outra coisa que no uma String sada do mtodo get, obteremos um erro de equiparao de tipos em tempo de compilao tal como essa mensagem: found: java.lang.String required: java.lang.Integer Integer data = myArrayList.get(0); Para se ter uma idia de como Generics usado, antes de entrarmos em mais detalhes, considere o seguinte fragmento de cdigo: ArrayList <String> genArrList = new ArrayList <String>(); genArrList.add("A generic string"); String myString = genArrList.get(0); JoptionPane.showMessageDialog(this, myString); Analisando estas instrues, observamos a palavra <String> aparecendo imediatamente aps a referncia do tipo ArrayList. Podemos interpretar esta como o primeiro comando da criao de uma instncia de uma verso da classe ArrayList utilizando Generics, e esta verso contm objetos do tipo String. genArrList est preso ao tipo String. Portanto, prender um Integer ou outro tipo no String ao resultado da funo get seria ilegal. A prxima instruo no seria vlida: int myInt = genArrList.get();

Introduo Programao II

JEDITM

3. Declarando uma Classe Utilizando Generics


Para que o fragmento de cdigo anterior funcione, deveramos ter definido uma verso da classe ArrayList que utilize Generics. Felizmente, a verso mais recente do Java fornece aos usurios verses que fazem uso de Generics para todas as implementaes de Collection. Nessa seo, aprenderemos como declarar sua prpria classe utilizando Generics. Ao invs de uma longa discusso sobre como declarar uma classe utilizando Generics, veremos um exemplo: class BasicGeneric <A> { private A data; public BasicGeneric(A data) { this.data = data; } public A getData() { return data; } } public class GenericDemo { public String method(String input) { String data1 = input; BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1); String data2 = basicGeneric.getData(); return data2; } public Integer method(int input) { Integer data1 = new Integer(input); BasicGeneric <Integer> basicGeneric = new BasicGeneric <Integer>(data1); Integer data2 = basicGeneric.getData(); return data2; } public static void main(String args[]) { GenericDemo sample = new GenericDemo(); System.out.println(sample.method("Some generic data")); System.out.println(sample.method(1234)); } } Na execuo desta classe ser mostrada a seguinte sada: Some generic data 1234 Iremos agora passar pelas instrues que possuem a sintaxe que utilizam Generics. Para a declarao da classe BasicGeneric: class BasicGeneric <A> o nome da classe seguido por um par de sinais menor que e maior que envolvendo a letra maiscula A: <A>. Isto chamado de um parmetro de tipo. Os usos desses sinais menor que e maior que indicam que a classe declarada uma classe que utiliza Generics. Isso significa que a classe no trabalha com nenhuma referncia a um tipo especfico. Por isso, observe que o atributo da classe foi declarado para ser do tipo A: private A data;

Introduo Programao II

JEDITM

Essa declarao especifica que o atributo data de um tipo Generic, e depende do tipo de dado com que o objeto BasicGeneric for desenvolvido para trabalhar. Quando declarar uma instncia da classe, deve ser especificada a referncia ao tipo com que se deseja trabalhar. Por exemplo: BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1); A sintaxe <String> aps a declarao de BasicGeneric especifica que essa instncia da classe ir trabalhar com variveis do tipo String. Podemos trabalhar com variveis do tipo Integer ou qualquer outro tipo de referncia. Para trabalhar com um Integer, o fragmento do cdigo teria a seguinte instruo: BasicGeneric <Integer> basicGeneric = new BasicGeneric <Integer>(data1); Consideremos a declarao para o mtodo getData: public A getData() { return data; } O mtodo getData retorna um valor do tipo A, que mtodo ter um tipo de dado em tempo de execuo, Depois de declarar um objeto do tipo BasicGeneric, especfico. Essa instncia atuar como se tivesse sido especfico, e apenas esse, desde o incio. um tipo Generic. Isso significa que o ou mesmo em tempo de compilao. A ser preso a um tipo de dado declarada para ter esse tipo de dado

No seguinte cdigo, duas instncias da classe BasicGeneric foram criadas. BasicGeneric <String> basicGeneric = new BasicGeneric <String>(data1); String data2 = basicGeneric.getData(); BasicGeneric <Integer> basicGeneric = new BasicGeneric <Integer>(data1); Integer data2 = basicGeneric.getData(); Note que a criao de uma instncia de uma classe que utiliza Generics bem similar criao de uma classe normal, exceto pelo tipo de dado especfico dentro dos sinais <> logo aps o nome do construtor. Essa informao adicional indica o tipo de dado com que voc trabalhar para essa instncia da classe BasicGeneric em particular. Depois de criada a instncia, possvel agora acessar os elementos da classe atravs dela. No existe mais a necessidade do typecast no valor do retorno do mtodo getData, uma vez que j foi decidido que ele ir trabalhar com um tipo de dado de referncia especfico.

3.1. Limitao "Primitiva"


Uma limitao de Generics em Java, que eles so restritos a tipos de referncia (Objetos) e no funcionaro com tipos primitivos. Por exemplo, o comando a seguir seria ilegal, uma vez que int um tipo de dado primitivo. BasicGeneric <int> basicGeneric = new BasicGeneric <int>(data1); Voc ter que encapsular os tipos primitivos primeiro, antes de us-los como argumentos Generics.

Introduo Programao II

JEDITM

3.2. Compilando Generics


Para compilar cdigos fonte Java com Generics usando JDK (v. 1.5.0), utilize a seguinte sintaxe: javac -version -source "1.5" -sourcepath src -d classes src/SwapClass.java onde src refere-se localizao do cdigo fonte java, enquanto class refere-se localizao onde o arquivo da classe ser gravado. Aqui est um exemplo: javac -version -source "1.5" -sourcepath c:\temp -d c:\temp c:/temp/SwapClass.java

Introduo Programao II

JEDITM

4. Generics Limitados
No exemplo mostrado anteriormente, os parmetros de tipo da classe BasicGeneric podem ser de qualquer tipo de dado de referncia. H casos, entretanto, onde voc quer restringir os tipos em potencial usados em instanciaes de uma classe do tipo Generics. Java permite limitar o conjunto de possveis tipos utilizados como argumento na instanciao de classes desse tipo, para um conjunto de subtipos de um determinado tipo amarrado classe. Por exemplo, podemos definir uma classe ScrollPane que utiliza Generics que serviria como um molde para um Container comum com a funcionalidade da barra de rolagem. Em tempo de execuo, o tipo da instncia dessa classe ser, geralmente, uma subclasse de Container, mas o tipo esttico ou geral simplesmente Container. Para limitar as instanciaes de tipo de uma classe, ns usamos a palavra-chave extends seguida pela classe que limita (ou restringe) o tipo Generics como parte de um parmetro de tipo. O exemplo a seguir limita as instanciaes de tipo da classe ScrollPane para subtipos da classe Container. class ScrollPane <MyPane extends Container> { ... } class TestScrollPane { public static void main(String args[]) { ScrollPane <Panel> scrollPane1 = new ScrollPane <Panel>(); // O comando seguinte ilegal ScrollPane <Button> scrollPane2 = new ScrollPane <Button>(); } } A instanciao de scrollPane1 vlida, uma vez que Panel uma subclasse de Container, enquanto a criao de scrollPane2 causaria um erro em tempo de compilao, uma vez que Button no uma subclasse de Container. Usar Generics limitados nos d um adicional, que a checagem esttica de tipos. Como resultado, ns temos a garantia que toda instanciao de um tipo Generics respeita os limites (ou restries) que atribumos a ele. Uma vez que asseguramos que toda instncia de tipo uma subclasse do limite atribudo, podemos chamar, de forma segura, qualquer mtodo encontrado no tipo esttico do objeto. Se no tivssemos colocado nenhum limite explcito no parmetro, o limite default seria Object. Isso significa que no podemos invocar mtodos em uma instncia do limite que no apaream na classe Object.

Introduo Programao II

JEDITM

5. Declarando Mtodos Generics


Alm de declarar classe Generics, tambm podemos declarar mtodos Generics. Estes mtodos so chamados polimrficos, e so definidos para serem mtodos parametrizados pelo tipo. Parametrizar mtodos til quando queremos realizar tarefas onde as dependncias de tipo entre os argumentos e o valor de retorno so Generics, mas no depende de nenhuma informao do tipo da classe, e mudar a cada chamada ao mtodo. Por exemplo, suponha que queremos adicionar um mtodo make em uma classe ArrayList. Este mtodo esttico admitiria um nico argumento, que seria o nico elemento do objeto ArrayList. Para fazer com que nosso ArrayList receba qualquer tipo de elemento, o argumento e o retorno do mtodo make deve utilizar Generics. Para declarar tipos Generics no nvel de mtodos, considere o exemplo a seguir: class Utilities { /* T extends Object implicitamente */ public static <T> ArrayList<T> make(T first) { return new ArrayList<T>(first); } } Java tambm utiliza um mecanismo de inferncia de tipos, para inferir automaticamente os tipos dos mtodos polimrficos baseado no tipo dos argumentos. Isso diminui o excesso de palavras, e a complexidade nas invocaes de mtodos. Para construir uma nova instncia de ArrayList<Integer>, ns simplesmente teramos o seguinte comando: Utilities.make(Integer(0));

Introduo Programao II

10

JEDITM

6. Generics e Colees Java


Uma discusso sobre mtodos da interface Collection j foi mostrada em lies anteriores. Entretanto, no JDK 5.0, esses mtodos foram atualizados para acomodar Generics. A tabela a seguir mostra os mtodos do JDK 5.0 equivalentes queles que voc estudou anteriormente. Mtodos da interface Collection public boolean add(E o) Insere o elemento especfico o nessa coleo. Retorna true se o foi adicionado com sucesso coleo. public void clear() Remove todos os elementos dessa coleo. public boolean remove(Object o) Remove uma nica instncia de Object o dessa coleo, se ele estiver presente. Retorna true se o foi encontrado e removido da coleo. public boolean contains(Object o) Retorna true se essa coleo contm o Object o. public boolean isEmpty() Retorna true se essa coleo no contm nenhum objeto ou elemento. public int size() Retorna o nmero de elementos nessa coleo. public Iterator<E> iterator() Retorna um iterator que nos permite acessar elementos da coleo. public boolean equals(Object o) Retorna true se o Object o igual a essa coleo. public int hashCode() Retorna o valor do hash code (i.e., o ID) para essa coleo. Mesmos objetos ou colees tm o mesmo valor de hash code ou ID.
Table 1: mtodos da interface Collection

Aqui est um exemplo de uma classe que no utiliza a verso Generics para a criao de uma lista, observe que podemos incluir sem problemas um objeto String entre os outros elementos import java.util.*; class GenericDemo { public static void main(String args[]) { List list = new ArrayList(); list.add(new Integer(1)); list.add(new Integer(2)); list.add("String"); System.out.println(list); Collections.sort(list); System.out.println(list); } } Executar esta classe gerada a seguinte sada: [1, 2, String] Exception in thread "main" java.lang.ClassCastException: java.lang.String at java.lang.Integer.compareTo(Integer.java:35) at java.util.Arrays.mergeSort(Arrays.java:1156) at java.util.Arrays.sort(Arrays.java:1080) at java.util.Collections.sort(Collections.java:117) at GenericDemo.main(GenericDemo.java:10) Java Result: 1 Pelo simples motivo que o Java no sabe como ordenar uma String juntamente com dois
Introduo Programao II 11

JEDITM

objetos inteiros, agora vejamos a mesma classe utilizando agora o Generics: import java.util.*; class GenericDemo { public static void main(String args[]) { List<Integer> list = new ArrayList<Integer>(); list.add(new Integer(1)); list.add(new Integer(2)); list.add("String"); System.out.println(list); Collections.sort(list); System.out.println(list); } } O que acontecer ser um erro de compilao na linha 8, ou seja, o Generics bloqueia os elementos estranhos a lista no permitindo que esta tenha elementos diversos fora o especificado.

Introduo Programao II

12

JEDITM

Parceiros que tornaram JEDITM possvel

Instituto CTS Patrocinador do DFJUG. Sun Microsystems Fornecimento de servidor de dados para o armazenamento dos vdeo-aulas. Java Research and Development Center da Universidade das Filipinas Criador da Iniciativa JEDITM. DFJUG Detentor dos direitos do JEDITM nos pases de lngua portuguesa. Banco do Brasil Disponibilizao de seus telecentros para abrigar e difundir a Iniciativa JEDITM. Politec Suporte e apoio financeiro e logstico a todo o processo. Borland Apoio internacional para que possamos alcanar os outros pases de lngua portuguesa. Instituto Gaudium/CNBB Fornecimento da sua infra-estrutura de hardware de seus servidores para que os milhares de alunos possam acessar o material do curso simultaneamente.

Introduo Programao II

13

Você também pode gostar