Usos Comuns dos Genéricos
- Coleções como Set e Map.
- Contêineres de elemento único como ThreadLocal< T > e AtomicReference< T >.
- Limitação: fixar número de parâmetros de tipo por contêiner.
Necessidade de Flexibilidade
- Exemplo: linha de banco de dados com muitas colunas.
- Solução: parametrizar a chave em vez do contêiner.
Exemplo de Implementação: Classe Favorites
Permite armazenar e recuperar instâncias favoritas de muitos tipos.
Utiliza objetos da classe Class como chave.
Class permite comunicação de informações em tempo de compilação e execução.
API da Classe Favorites
- Cliente apresenta um objeto Class para configurar e recuperar favoritos.
- Exemplo de uso:
Implementação da Classe Favorites
- Utiliza Map < Class<?>, Object> para armazenar favoritos.
- putFavorite insere o objeto favorito no mapa.
- getFavorite recupera e faz cast dinâmico para o tipo correto usando Class.cast.
Limitações da Classe Favorites
- Segurança de tipos pode ser corrompida por clientes maliciosos usando Class bruto.
- Não pode ser usada com tipos não reificados (ex: List).
- putFavorite pode verificar instâncias para assegurar segurança:
Wrappers de Coleção Typesafe
- java.util.Collections oferece wrappers como checkedSet, checkedList, checkedMap.
- Adicionam reificação às coleções, lançando ClassCastException em inserções incorretas.
Tokens de Tipo Limitados
- Exemplo: método getAnnotation na interface AnnotatedElement.
- Utiliza Class<? extends Annotation> como token de tipo limitado.
- Class.asSubclass realiza cast seguro dinamicamente.
Resumo Final
- Contêineres genéricos normalmente têm número fixo de parâmetros de tipo.
- Contêineres heterogêneos typesafe usam parâmetros de tipo nas chaves.
- Objetos Class podem ser usados como tokens de tipo.
- Tokens de tipo personalizados também podem ser usados, como DatabaseRow e Column.
Top comments (0)