BT

Java: Protótipo de aprimoramento do Generics

| por Ben Evans Seguir 22 Seguidores , traduzido por Rafael Sakurai Seguir 29 Seguidores em 23 fev 2015. Tempo estimado de leitura: 3 minutos |

O Java 8 foi liberado ano passado e o Java 9 está previsto para o meio de 2016. Apesar disso, alguns detalhes interessantes das funcionalidades planejadas para a versão futura do Java (esperançosamente o Java 10) começaram a surgir.

Especificamente, duas grandes funcionalidades começaram a ser prototipadas: aprimoramento dos generics e tipos de valores. O aprimoramento do generics possui funcionalidades que permitirá aos futuros desenvolvedores Java escreverem algo como: List<int> sem ter que encapsular os tipos primitivos. No entanto, o design propõe uma nova forma de generics que contém algumas sutilezas que devem ser abordadas com cuidado, como Brian Goetz explicou recentemente no documento do estado atual da especificação.

O Java sempre teve foco na retro compatibilidade, e sob o comando da Oracle, esse ponto de vista foi reafirmado. Por essa razão, a Oracle está pretendendo usar uma tática similar à usada na introdução do generics no Java 5 - uma abordagem que eles se referem como "migração de compatibilidade gradual".

O problema básico de design que precisa ser resolvido é que o sistema de tipos do Java não tem uma raiz unificada. Não há tipos no Java que sejam super tipo de Object e int. Isso pode ser visto na estrutura do bytecode da JVM, ainda é preciso levar em consideração o fato de que os bytecodes para retornar um int (ireturn) são diferentes do bytecode para retornar um Objeto (areturn).

O protótipo atual usa uma abordagem chamada "any (qualquer)" tipo de variável para indicar que o tipo da variável pode ser tanto de referência (objetos) como de primitivos (e também para a proposta do novo tipo de valor). Isso está atualmente escrito como Container<any T>, mas a sintaxe ainda está em desenvolvimento e pode haver mudança pela frente.

O pensamento atual é que embora List<Integer> e List<String> continuem sendo representadas em tempo de execução pela classe List, o List<int> será representado por um tipo diferente (e potencialmente um classfile diferente). Essa abordagem é chamada de "especialização genérica" para os tipos primitivos. Isso também ajuda com outros problemas de design como: atualizar as classes de coleções existentes para usar esse generics aprimorado. O objetivo chave do design é permitir que os desenvolvedores tenham uma List<int>, portanto haverá um caminho de migração do tipo genérico atual para suportar qualquer tipo de variável nas versões futuras.

Há também algumas surpresas em termos de como o generics aprimorado entrará no sistema de tipos. Em particular, a List<int> não é um subtipo do próprio tipo List (se ele fosse, então isso poderia implicar que o List<int> armazene instancias de Object). No entanto, List<?> é um subtipo de List, então isso indica que List<int> não é um subtipo de List<?> e que os wildcards não funcionarão nos generics aprimorado.

O protótipo atual ainda tem um longo caminho até ficar pronto para produção e há mais trabalho de design e implementação para fazer. Em particular, a implementação da especificação está sendo ativamente trabalhada. A geração automática do código da especialização é desejável (e reduz a escrita de código repetitivo), mas isso pode precisar de suporte adicional do bytecode e do subsistema de carregamento de classes. Uma intrigante possibilidade é a introdução da meta programação para facilitar no nível da maquina virtual (mas não diretamente no suporte da linguagem Java). Essa abordagem está sendo referenciada como "classdynamic" sendo análoga ao invokedynamic como descrita na sua especificação.

O desenvolvimento do generics aprimorado e dos tipos de valores estão sendo conduzidos pelo Projeto Valhalla e mais detalhes podem ser encontrados nele.

Avalie esse artigo

Relevância
Estilo/Redação

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

Evolução by Petterson Andrade

Essa feature com Generics evoluido vai mudar miuto a vida do desenvolvedor Java. Acredito que vários comportamentos em frameworks serão simplificados.

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

1 Dê sua opinião

Faça seu login para melhorar sua experiência com o InfoQ e ter acesso a funcionalidades exclusivas


Esqueci minha senha

Follow

Siga seus tópicos e editores favoritos

Acompanhe e seja notificados sobre as mais importantes novidades do mundo do desenvolvimento de software.

Like

Mais interação, mais personalização

Crie seu próprio feed de novidades escolhendo os tópicos e pessoas que você gostaria de acompanhar.

Notifications

Fique por dentro das novidades!

Configure as notificações e acompanhe as novidades relacionada a tópicos, conteúdos e pessoas de seu interesse

BT