Programação Java: Tudo sobre Generics

Um dos objetivos do projeto original para Java era manter a linguagem mais simples possível. A desenvolvedora do idioma levou alguns recursos desnecessariamente complicados de C ++ e jogou-os para fora da janela. O resultado foi uma linguagem que era elegante e elegante. Algumas pessoas disseram que a linguagem era muito elegante.

Então, depois de vários anos de discussão e brigas, Java tornou-se um pouco mais complicado. Até o ano de 2004, Java teve enum tipos, reforçada para loops, importação estática, e alguns outros novos recursos interessantes. Mas o respeito falou novo recurso mais foi a introdução dos genéricos.

ArrayList pessoas = new ArrayList() -

O uso de qualquer coisa como era novo em Java 5.0. No velho estilo de Java, você escreveria

pessoas ArrayList = new ArrayList () -

Naqueles dias, um ArrayList pode armazenar quase qualquer coisa que você queria colocar nele - um número, um Conta, uma Quarto, uma Corda . . . qualquer coisa. o ArrayList classe era muito versátil, mas com essa versatilidade vieram algumas dores de cabeça. Se você pode colocar qualquer coisa em um ArrayList, você não poderia facilmente prever o que você iria ficar fora de um ArrayList.

Em particular, você não poderia facilmente escrever código que achei que você tinha armazenado certos tipos de valores no ArrayList. Aqui está um exemplo:

coisas ArrayList = new ArrayList () - things.add (nova Conta ()) - Conta MyAccount = things.get (0) - // NÃO USE ESTE. É o código BAD.

Na terceira linha, a chamada para get (0) agarra o valor mais próximo na coisas coleção. A chamada para get (0) é bom, mas, em seguida, o compilador engasga com a tentativa de atribuição de minha conta. Você receberá uma mensagem na terceira linha dizendo que o que você começa a partir do coisas lista não pode ser enchido no minha conta variável.

Você receber essa mensagem, porque, no momento em que o compilador atinge a terceira linha, ele se esqueceu de que o item adicionado na segunda linha era do tipo Conta!

A introdução dos genéricos corrige esse problema:

coisas ArrayList = new ArrayList () - things.add (nova Conta ()) - Conta MyAccount = things.get (0) - // usar este código em seu lugar. É BOM CODE.

Adicionando em dois lugares informa o compilador que coisas lojas Conta instâncias - nada mais. Então, na terceira linha no código anterior, você recebe um valor da coisas coleção. Então, porque coisas única lojas Conta objetos, você pode fazer minha conta referem-se a esse novo valor.

Java 5.0 adicionou genéricos de Java. Mas logo após o nascimento de Java 5.0, os programadores notaram como desajeitado o código para os genéricos podem ser. Afinal, você pode criar os genéricos dentro de genéricos. A ArrayList pode conter um grupo de matrizes, cada um dos quais pode ser um ArrayList. Então você pode escrever

ArrayList[]> Bagunça = new ArrayList[]> () -

Toda a repetição em que bagunça declaração dá aos programadores uma dor de cabeça! Para evitar essa feiúra, Java 7 e versões posteriores têm um operador de diamante, lt;>. O operador de diamante diz Java para reutilizar tudo o que stuff insanamente complicado você colocar na parte anterior da declaração genérica.

Neste exemplo, a lt;> diz Java para reutilizar []>, mesmo que você escreve []> apenas uma vez. Aqui está como o código simplificado Java 7 looks:

ArrayList[]> Bagunça = new ArrayListlt;>() -

Em Java 7 e, mais tarde, você pode escrever qualquer um destes bagunça declarações - a declaração original, desagradável com duas ocorrências de ArrayList[], ou o simplificado (apenas levemente desagradável) declaração com o operador de diamante e apenas um ArrayList[] ocorrência.

Sim, o código simplificada ainda é complicada. Mas sem toda a ArrayList[] repetição, o código simplificado é menos pesado. O operador de diamante Java 7 tira uma chance para você copiar algo incorretamente e tem um grande erro no seu código.

menu