CEA032 – PROGRAMAÇÃO DE
COMPUTADORES II
Prof. Filipe Nunes Ribeiro
INTRODUÇÃO
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
INTRODUÇÃO
Já utilizamos tipos genéricos?
INTRODUÇÃO
Onde seria útil tipos genéricos?
Array de vários tipos (Inteiro, String, ContaCorrente,
Empregado)
Método de ordenação é igual?
Classe Pilha (com vários objetos)
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
EXEMPLO DE SOBRECARGA DE MÉTODOS
MetodosSobrecarregados.java
Parte 1
EXEMPLO DE SOBRECARGA DE MÉTODOS
MetodosSobrecarregados.java
Parte 2
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
MÉTODOS GENÉRICOS
Se fôssemos substituir os tipos de elemento em cada
método por um nome genérico – T por convenção – como
ficaria?
MÉTODOS GENÉRICOS
Se fôssemos substituir os tipos de elemento em cada
método por um nome genérico – T por convenção – como
ficaria?
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
MÉTODOS GENÉRICOS
Se as operações realizadas por vários métodos
sobrecarregados são idênticas para cada tipo de
argumento...
... pode ser escrita uma única declaração de um método
genérico que pode ser chamada com argumentos de tipos
diferentes.
MÉTODOS GENÉRICOS
MetodosSobrecarregados.java
Com generics
Nova Implementação
Mais Simples
Economia de Código
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
MÉTODOS GENÉRICOS
Declaração de métodos genéricos
Seção de parâmetros
Separado por sinal de maior e menor
Precede o tipo de retorno do método
Contém um ou mais parâmetros formais (parâmetro de tipos)
MÉTODOS GENÉRICOS
Declaração de métodos genéricos
Parâmetros formais
Identificador que especifica um nome genérico do tipo (T, M – não
importa o nome) mas ele deve ser igual ao tipo utilizado no
método.
É recomendável que os parâmetros formais sejam especificados
com letras maiúsculas individuais. Tipicamente, um parâmetro
formal que representa o tipo de um elemento do array é nomeado
T
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
MÉTODOS GENÉRICOS
Declaração de métodos genéricos
Parâmetros formais
Podem referenciar apenas tipos por referência (Não primitivos)
Um parâmetro de tipo pode ser declarado apenas uma vez, porem
MÉTODOS GENÉRICOS
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
MÉTODOS GENÉRICOS
Locais onde T poderá
referenciar Double,
Integer ou Character
MÉTODOS GENÉRICOS
No exemplo visto anteriormente
Declarando o método imprimeArray como um método
genérico eliminou-se a necessidade dos métodos
sobrecarregados
Economizou-se 19 linhas de código
Criou-se um método reutilizável que pode ser utilizado
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
MÉTODOS GENÉRICOS
Poderíamos fazer isso?
MÉTODOS GENÉRICOS
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
MÉTODOS GENÉRICOS
Poderíamos fazer isso?
O resultado seria o mesmo?
Sim. O resultado seria o mesmo. Os
benefícios da utilização de tipos
genéricos tornam-se aparentes
quando o método também retorna
um tipo genérico como veremos a
seguir.
MÉTODOS GENÉRICOS
Poderíamos fazer isso?
Na prática, o compilador faz isso
Remove seção de parâmetros de
tipo e os substitui por tipos reais
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
MÉTODOS GENÉRICOS
Podemos restringir os tipos que um método genérico
pode receber
Podemos exigir que o tipo implemente uma interface ou
seja subclasse de uma determinada classe
Para isso usamos a seguinte notação no parâmetro
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
MÉTODOS GENÉRICOS
Auto-Boxing é feito automaticamente (conversão de int
para Integer)
O compilador verifica que não existe um método ‘maximo’
com dois inteiros como parâmetro mas existe um método
genérico que recebe dois parâmetros
Implicitamente converte por autoboxing os dois valores de
int para Integer
A classe Integer implementa a interface
Comparable<Integer> e portanto o método pode ser
executado
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
CLASSES GENÉRICAS
Permitem parametrizar as variáveis de instância da
classe, os tipos dos argumentos e retorno dos métodos
Especificamos os parâmetros de tipo após o nome da
classe:
public class NomeDaClasse <E> { . . . }
Suponha que precisamos de uma pilha de Integer e uma
pilha de Double. Com Genéricos, precisamos escrever a
definição da classe Pilha apenas uma vez
CLASSES GENÉRICAS
Ao criarmos uma instância da classe Pilha temos que
especificar o tipo dos elementos armazenados na pilha.
Se tentarmos acrescentar um elemento de tipo diferente
ocorre erro de compilação. Isso garante uma maior
segurança para o programador
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
CLASSES GENÉRICAS
CLASSES GENÉRICAS
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
CLASSES GENÉRICAS
CLASSES GENÉRICAS
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
CLASSES GENÉRICAS
CLASSES GENÉRICAS
Mesmo quando uma classe é genérica, podemos criar
uma instância dessa classe sem passar nenhum
argumento para os parâmetros de tipo:
Pilha pilha = new Pilha( 10 );
Dizemos que a pilha armazena tipos brutos, ou seja,
pode armazenar qualquer tipo de objeto.
Na verdade, cada parâmetro de tipo é substituído pelo
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
CLASSES GENÉRICAS
No Java 5, as coleções (Framework Collection) passaram
CLASSES GENÉRICAS
No Java 5, as coleções (Framework Collection) passaram
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas