Cursos / Informática para Internet / Programação Orientada a Objetos / Aula
Chegamos ao momento mais interessante do nosso conteúdo, vamos aprender agora como a utilização de Generics irá facilitar a nossa vida na manipulação de coleções em Java, fazendo com que possamos criar códigos mais robustos e legíveis.
Sabemos que Arrays em Java sempre foi type safe, Opa! O que danado é isso? Calma, type-safe é apenas uma expressão muito utilizada no mundo Java para dizer que um determinado elemento é fortemente tipado. Voltando ao nosso Array, significa que se o declararmos como sendo do tipo String (String []), não poderemos fazer atribuições de outros elementos, tais como Integer, Dog, ou qualquer outra coisa diferente de String.
Devemos lembrar que antes do Java 5 não havia sintaxe para declarar uma coleção como type-safe. Para fazer um ArrayList de String, tínhamos que fazer a seguinte declaração:
Ou utilizarmos a forma polimórfica:
Não havia sintaxe que nos permitisse especificar que myList só deveria aceitar String e nada mais além de String. Sendo assim, como não tinha essa restrição nativa da linguagem, o compilador também não tinha como forçá-lo a colocar apenas os elementos do tipo especificado dentro da lista. Vamos dar uma olhada na prática para entender melhor a respeito do problema que tínhamos antes do Java 5.
Note que tudo que fizemos acima foi totalmente legal, nenhum erro de compilação ou alerta de tipos indevidos, ou seja, uma coleção não genérica poderá conter todos os tipos de elementos, mas qual é o problema disso? O que isso significa?
Então, vamos lá... Isso significa que é de TOTAL responsabilidade do programador tomar todos os cuidados ao manipular a Lista, ou seja, não existe restrição nativa da sintaxe que force as coleções a só receberem elementos de um determinado tipo pré-estabelecido.
E você acha que acabou os seus problemas? Ainda não... tem mais, pois as coleções podem receber qualquer tipo de coisa, o método que recupera objetos da coleção só poderá ser de um único tipo! Alguém se arriscaria a dizer? Essa é fácil... Só poderia ser mesmo o famoso – java.lang.Object. E o que isso significa na prática? Então, vamos voltar ao nosso exemplo acima e recuperar o nosso elemento do tipo String que havíamos adicionado inicialmente:
Opa! Tenho que fazer um Cast para recuperar a minha String! É isso mesmo! Porém, ainda tem mais um pequeno probleminha! Não temos como garantirque o retorno será realmente uma String, sendo assim, o nosso Cast ainda pode falhar em tempo de execução! Tudo isso porque as coleções aceitam qualquer coisa como entrada e não temos como garantir o que vai ser retornado no final, apenas rezamos para que aquele programador extremamente experiente (Estagiário) tenha se preocupado em colocar todos os elementos na coleção como sendo String, e tudo irá funcionar corretamente!
Poxa, agora fiquei triste de verdade, eu estava tão acostumado com o compilador me dizendo tudo o que eu fiz de errado, e agora você me vem com essa de que ele não vai poder me ajudar nas coleções!
Calma, isso ficou para trás, você não prestou atenção quando eu disse que todo esse problema era antes do Java 5, agora temos uma ferramenta muito forte ao nosso favor, e que vai nos ajudar não apenas com as coleções, mas em quase tudo em Java podemos nos beneficiar do uso do Generics.
Ufa! Agora fiquei mais tranqüilo!
Então, vamos lá, chegou a hora das boas notícias! O Generics nos ajudará em dois pontos, na hora de colocarmos e na hora de retirarmos elementos das coleções, através da aplicação do tipo específico. Vamos dar uma olhada na prática de como isso acontece de verdade! Lembra do nosso exemplo anterior?
Muito Bom!! Era exatamente o que queríamos! Usar a sintaxe Generics significa que temos que colocar o tipo da coleção dentro dos elementos “<” e “>”, como <String>. Então, agora tudo que você coloca dentro da coleção é garantido de ser uma String. E as boas notícias não param de chegar, com o Generics tudo o que recuperamos também é garantido de ser uma String. Vamos dar uma olhada mais de perto!
Antes do Generics, não tínhamos garantia do tipo de retorno:
Agora nós apenas fazemos:
O compilador já sabe antecipadamente que myList contém apenas objetos do tipo String, os quais podem ser atribuídos a uma referência String, então, agora não é mais necessário fazer o Cast. Agora, a nossa vida ficou realmente mais simples e podemos ir mais além, vamos dar uma olhada em como isso funcionaria com o novo for-each que aprendemos agora pouco.
Versão 5.3 - Todos os Direitos reservados