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

Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable (pacote java.lang). ... Exercícios

  • Upload
    dodieu

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Métodos Genéricos

Prof.: Michele Nasu Tomiyama Bucci

Page 2: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Introdução

Métodos genéricos e classes genéricas (e interfaces)

permitem especificar, com uma única declaração de

método, um conjunto de métodos relacionados ou, com

uma única declaração de classe, um conjunto de tipos

relacionados, respectivamente.

Os genéricos também fornecem segurança de tipo em

tempo de compilação que permite capturar tipos

inválidos em tempo de compilação.

Page 3: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Introdução

Métodos sobrecarregados são frequentemente utilizados

para realizar operações semelhantes em tipos diferentes

de dados.

Estude cada método printArray.

Page 4: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 5: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 6: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Observe que o tipo de elemento do array de tipos

aparece no cabeçalho de cada método e no cabeçalho da

instrução for.

Se fôssemos substituir os tipos de elementos em cada método com um nome genérico —T por convenção —

então todos os três métodos se pareceriam da seguinte

forma:

Page 7: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 8: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Métodos Genéricos

Se as operações realizadas por vários métodos

sobrecarregados forem idênticas para cada tipo de

argumento, os métodos sobrecarregados podem ser

codificados mais compacta e convenientemente com um

método genérico.

Você pode escrever uma única declaração de método

genérico que pode ser chamada com argumentos de

tipos diferentes.

Com base nos tipos dos argumentos passados para o

método genérico, o compilador trata cada chamada

de método apropriadamente.

Page 9: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 10: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 11: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Métodos Genéricos

Todas declarações de método genérico têm uma seção

de parâmetro de tipo delimitada por colchetes

angulares (< e >) que precede o tipo de retorno do

método (<T> nesse exemplo).

Cada seção de parâmetro de tipo contém um ou mais

parâmetros de tipos (também chamados parâmetros

de tipo formais), separados por vírgulas.

Um parâmetro de tipo, também conhecido como

variável de tipo, é um identificador que especifica o

nome de um tipo genérico.

Page 12: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Métodos Genéricos

Pode ser utilizado para declarar o tipo de retorno, tipos

de parâmetros e tipos de variáveis locais em um método

genérico, e atuam como marcadores de lugar para os

tipos dos argumentos passados ao método genérico

(argumentos de tipos reais).

O corpo de um método genérico é declarado como o de

qualquer outro método.

Parâmetros de tipo podem representar somente tipos

por referência —não tipos primitivos.

Page 13: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Parâmetro de tipo como o tipo de retorno

O método genérico maximum determina e retorna o maior de seus três argumentos do mesmo tipo.

O operador relacional > não pode ser utilizado com tipos de referência, mas é possível comparar dois objetos da mesma classe se essa classe implementa a interface genérica Comparable <T> (pacote java.lang).

Todas as classes empacotadoras de tipo para tipos primitivos implementam essa interface.

Como ocorre com classes genéricas, interfaces genéricas permitem especificar, com uma única declaração de interface, um conjunto de tipos relacionados.

Page 14: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Parâmetro de tipo como o tipo de retorno

Os objetos Comparable<T> têm um método

compareTo.

object1.compareTo(object2);

O método deve retornar 0 se os objetos forem iguais,

um número inteiro negativo se object1 for menor que

object2 ou

um número inteiro positivo se object1 for maior que

object2.

Page 15: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Tipo de

retorno

Page 16: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

A seção de parâmetro de tipo especifica que T estende Comparable<T> - somente objetos das classes que

implementam a interface Comparable<T> podem ser

utilizados com esse método.

Declarações do parâmetro de tipo que limitam o parâmetro sempre utilizam a palavra-chave extends

independentemente de o parâmetro de tipo estender

uma classe ou implementar uma interface.

A restrição à utilização de objetos Comparable<T> é

importante, pois nem todos os objetos podem ser

comparados.

Page 17: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Exercícios

Faça um método genérico que retorna o maior valor

armazenado em um array.

Faça um método genérico que verifica de um valor está

armazenado em um array.

Faça um método genérico que verifica se um array está

ordenado.

Faça um método genérico que verifica se um array possui

valores repetidos.

Faça um método genérico que dados 2 arrays, mostre os

valores que aparecem em ambos os arrays.

Page 18: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Classes Genéricas

O conceito de uma estrutura de dados, como uma pilha,

pode ser entendido independentemente do tipo de

elemento que ela manipula.

Classes genéricas fornecem um meio de descrever o

conceito de uma pilha (ou de qualquer outra classe) de

uma maneira independente do tipo.

Essas classes são conhecidas como classes

parametrizadas ou tipos parametrizados porque

aceitam um ou mais parâmetros.

Page 19: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 20: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 21: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 22: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 23: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Tipos Brutos

Também é possível instanciar uma classe genérica Stack

sem especificar um argumento de tipo, como a seguir:

// nenhum argumento de tipo especificado

Stack objectStack = new Stack( 5);

Dizemos que objectStack tem um tipo bruto.

O compilador utiliza implicitamente o tipo Object por

toda a classe genérica para cada argumento de tipo.

A instrução precedente cria uma Stack que pode

armazenar objetos de qualquer tipo.

Page 24: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 25: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Tipos Brutos

Linha 11: rawTypeStack1cria uma Stack que pode

armazenar objetos de qualquer tipo (tipo bruto).

Linha 14: rawTypeStack2 cria uma Stack que poderia

armazenar outros tipos além de Double.

Linha 17: integerSatck cria uma Stack que armazena

objetos do tipo Integer.

Page 26: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 27: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 28: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 29: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Curingas

Suponha que se queira implementar um método genérico

sum que some os números de uma coleção

(ArrayList).

Qualquer valor int inserido seria auto-empacotado

como um objeto um objeto Integer e qualquer valor

double seria convertido por autoboxing em um

objeto Double.

O método deverá ser capaz somar todos os valores do ArrayList independentemente dos seus tipos.

Assim, será declarado o arrayList com o argumento

do tipo <Number>.

Page 30: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 31: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios
Page 32: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Como o curinga (?) no cabeçalho do método não

especifica um nome de parâmetro de tipo, você não pode

utilizá-lo como um nome de tipo por todo o corpo do método (isto é, não pode substituir Number por ? na

linha 55).

Você pode, porém, declarar o método sum dessa

maneira:

public static<T extends Number> doublesum

(ArrayList< T > list)

Isso permite ao método receber uma ArrayList que

contém elementos de qualquer subclasse Number.

Page 33: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

Exercício

Faça uma classe genérica Par que tem 2 parâmetro de

tipo – F e S, cada um representando respectivamente o

tipo do primeiro elemento e o tipo do segundo elemento do par. Adicione os métodos set e get.

O cabeçalho da classe deve ser: public class Par

<F,S>.

Crie um array de Par e verifique se o método printArray

irá funcionar. Caso não funcionar, reescreva o método

pra que imprima os todos os pares do array.

Page 34: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

public class Par<F,S> {

private F first;

private S second;

public Par(F x, S y){

first=x;

second = y;

}

public void setFirst(F x){

first = x;

}

public void setSecond(S x){

second = x;

}

public F getFirst(){

return first;

}

public S getSecond(){

return second;

}

public void printPar(){

System.out.println("First: "+first+"\nSecond: "+second);

}

}

Page 35: Métodos Genéricosmichele/POO2/Métodos Genéricos.pdf · da mesma classe se essa classe implementa a interface genérica Comparable  (pacote java.lang). ... Exercícios

public class testePar {

public static void main(String args[]){

Par par1 = new Par<Integer,Double>(1,56.89);

Par par2 = new Par<Integer,Double>(2,2.2);

Par par3 = new Par<Integer,Double>(3,3.3);

Par[] arrayPar = new Par[3];

arrayPar[0]=par1;

arrayPar[1]=par2;

arrayPar[2]=par3;

printArray(arrayPar);

}

public static <T extends Par> void printArray(T[] array){

for(int i=0;i<array.length; i++){

System.out.println("First: "+array[i].getFirst());

System.out.println("Second: "+array[i].getSecond());

}

}

}