Bounded Types em Java: Restrições com Subtipos
Java Generics é uma ferramenta extremamente valiosa para escrever código flexível e seguro. Através de uma funcionalidade chamada Bounded Types (Tipos Limitados), os Generics podem ser ainda mais úteis, permitindo que você restrinja os tipos de dados que uma classe genérica pode aceitar. Neste artigo, vamos explorar os Bounded Types em mais detalhes, com exemplos que enfatizam como é possível restringir os valores com base na propriedade de serem subtipos.
Em nosso ponto de partida, temos a seguinte estrutura de código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class TiposLimitados { public static void main(String[] args) { // MinhaClasseGenerica<String> g2 = new MinhaClasseGenerica(); // Gera erro MinhaClasseGenerica<Integer> g2 = new MinhaClasseGenerica(); // Não Gera Erro porque é um subtipo // MinhaClasseGenerica<Double> g2 = new MinhaClasseGenerica(); // Não Gera Erro porque é um subtipo g2.setMinhaVariavel(10); g2.imprimeMinhaVariavel(); } } class MinhaClasseGenerica<T extends Number>{} |
Neste código, a classe genérica MinhaClasseGenerica
está sendo limitada para aceitar apenas tipos que sejam subtipos de Number
, como evidenciado pelo uso de T extends Number
.
Isso significa que qualquer tentativa de instanciar MinhaClasseGenerica
com um tipo de dado que não seja um subtipo de Number
irá resultar em um erro de compilação. É por isso que a linha MinhaClasseGenerica<String> g2 = new MinhaClasseGenerica();
está comentada com o aviso “// Gera erro”, enquanto as outras duas instâncias, MinhaClasseGenerica<Integer> g2 = new MinhaClasseGenerica();
e MinhaClasseGenerica<Double> g2 = new MinhaClasseGenerica();
não geram erros, pois tanto Integer
quanto Double
são subtipos de Number
.
Agora, vamos expandir nosso exemplo para ilustrar o uso mais amplo de Bounded Types. Primeiro, precisamos expandir a MinhaClasseGenerica
para incluir um método setMinhaVariavel(T valor)
que definirá um valor e um método imprimeMinhaVariavel()
para imprimir este valor.
1 2 3 4 5 6 7 8 9 10 11 |
class MinhaClasseGenerica<T extends Number> { T minhaVariavel; void setMinhaVariavel(T valor) { minhaVariavel = valor; } void imprimeMinhaVariavel() { System.out.println(minhaVariavel); } } |
Agora, podemos instantiar MinhaClasseGenerica
com diferentes subtipos de Number
, passar valores para a instância e imprimir esses valores, como mostra o código a seguir.
1 2 3 4 5 6 7 8 9 10 11 |
public class TiposLimitados { public static void main(String[] args) { MinhaClasseGenerica<Integer> g1 = new MinhaClasseGenerica(); g1.setMinhaVariavel(10); g1.imprimeMinhaVariavel(); // Imprime "10" MinhaClasseGenerica<Double> g2 = new MinhaClasseGenerica(); g2.setMinhaVariavel(15.5); g2.imprimeMinhaVariavel(); // Imprime "15.5" } } |
Aprenda Java em 5 Dias. Curso 100% Prático.
Melhor Preço por Tempo Limitado. Clique Aqui e Teste Sem Risco.
30 Dias de Satisfação Garantida!
Deste modo, fica claro que os Bounded Types permitem uma restrição segura dos tipos que uma classe genérica pode aceitar, ao mesmo tempo em que mantêm a flexibilidade e a reutilização de código que tornam os Generics tão úteis. Além disso, eles ajudam a prevenir erros de programação ao garantir que apenas os tipos de dados corretos sejam utilizados, aumentando a robustez e a manutenibilidade do código. Por esses motivos, os Bounded Types são uma excelente adição à sua caixa de ferramentas de programação em Java.