13.5. O interface genérico List<E>

Até agora, sempre que precisámos de representar coleções de objetos usámos arrays. Existem outros tipos não primitivos, definidos através de classes e interfaces na biblioteca do Java, que nos permitem representar coleções de objetos. Estas classes e interfaces compõem aquilo que usualmente se chama de collection framework.

Para já, vamos ver só o interface List e uma das suas várias implementações – a classe ArrayList, ambos do pacote java.util.

13.5.1. Porquê "genérico"?

Quando pensamos no conceito de lista, imaginamos uma coleção ordenada, uma sequência de elementos. Sobre essa coleção podemos adicionar elementos, retirar elementos, aceder a um elemento numa dada posição da lista, etc.

Se tivermos três listas – uma com elementos do tipo Jogo, outra com elementos do tipo Integer e ainda outra com elementos do tipo Pessoa –, percebemos que as operações atrás referidas não diferem pelo facto de os tipos dos elementos de cada lista serem diferentes, ou seja, o mecanismo das operações não depende do tipo específico dos elementos que a lista contém.

Então, ter três classes distintas que definem listas de elementos do tipo Jogo, do tipo Integer e do tipo Pessoa, respetivamente, seria um desperdício de tempo e espaço, pois elas seriam todas iguais excetuando no tipo de retorno ou de parâmetro de um ou outro método (como, por exemplo, do método que acede ao elemento numa dada posição da lista e do método que insere um elemento na lista).

Em vez disso, define-se o tipo genérico List<E> que abstrai o tipo dos elementos da lista:

Em Java, o interface List<E> define

 

13.5.2. Usando listas

Alguns dos métodos definidos no interface List<E> (https://docs.oracle.com/javase/9/docs/api/java/util/List.html):

O primeiro elemento de uma lista myList é o que está na posição de índice zero. O último elemento está na posição de índice myList.size()-1

Uma das classes que implementam o interface List<E> é a classe ArrayList<E> (https://docs.oracle.com/javase/9/docs/api/java/util/ArrayList.html).

 

Um tipo genérico pode ter mais que uma variável de tipo. Um exemplo é o interface Map<K,V> do pacote java.util.

Para podermos usar uma lista num programa Java teremos que instanciar a variável de tipo E. Somente tipos não primitivos podem ser usados para instanciar as variáveis de tipo de um tipo genérico.

Por exemplo, se eu quiser usar uma lista de inteiros no meu programa, terei que instanciar a variável de tipo com Integer, que é uma classe wrapper (embrulho) dos inteiros.

Um parentesis:

Tipos primitivos: autoboxing

Cada tipo primitivo tem uma classe correspondente (chamada wrapper ) e as conversões entre ambas são feitas de forma automática:

 

Voltando agora à utilização de tipos genéricos. O seguinte programa declara, cria e usa uma lista de inteiros:

Um possível output deste programa:

 

Agora que já conhece os tipos List e ArrayList, antes de passarmos para o próximo capítulo aproveitamos para modificar o tipo de retorno do método vencedores do interface Ganhavel para retornar uma List<String> em vez de um array de String. Irá notar que a nova classe Jogo no próximo capítulo irá beneficiar do uso mais intensivo destes dois tipos de dados.

 

 


 

Anterior: 13.4. O interface Ganhavel

Seguinte: 14. Herança