BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Java: Protótipo de aprimoramento do Generics

Java: Protótipo de aprimoramento do Generics

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

Conteúdo educacional

BT