Os genéricos em Java oferecem flexibilidade e segurança, mas possuem algumas restrições importantes. Estas envolvem instanciação de parâmetros de tipo, membros estáticos, arrays genéricos e exceções genéricas.
1. Instanciação de Parâmetros de Tipo
- Não é possível criar uma instância diretamente de um parâmetro de tipo.
Exemplo inválido:
class Gen<T> {
T ob;
Gen() {
ob = new T(); // Inválido!
}
}
- Motivo: O compilador não sabe que tipo real T representa, pois é apenas um espaço reservado.
- Solução alternativa: Use um fábrica de objetos ou receba a instância já criada como argumento.
2. Restrições aos Membros static
Membros static não podem usar parâmetros de tipo genéricos da classe externa.
Exemplo inválido:
class Wrong<T> {
static T ob; // Inválido!
static T getob() { // Inválido!
return ob;
}
}
Motivo: O contexto estático é compartilhado entre todas as instâncias da classe, enquanto os parâmetros genéricos podem variar de uma instância para outra.
Solução alternativa: Declare métodos static que definam seus próprios parâmetros de tipo:
static <U> U genericMethod(U value) {
return value;
}
3. Arrays Genéricos
Restrições com arrays e genéricos:
- Não é possível instanciar um array de tipo genérico.
T vals[]; // Válido como referência
vals = new T[10]; // Inválido!
- Não é possível criar arrays de referências genéricas específicas de um tipo
Gen<Integer> gens[] = new Gen<Integer>[10]; // Inválido!
Motivo: Durante a execução, o erasure elimina as informações de tipo, tornando impossível criar arrays seguros.
Solução alternativa:
Use arrays existentes:
vals = nums; // Atribuir array existente é válido.
- Use curingas
Gen<?> gens[] = new Gen<?>[10]; // Correto.
4. Exceções Genéricas
Uma classe genérica não pode estender Throwable.
Exemplo inválido:
class GenException<T> extends Exception { // Inválido!
T value;
}
Motivo: Isso poderia comprometer o mecanismo de tratamento de exceções em tempo de execução.
Solução: Use classes genéricas normais para encapsular informações e depois as integre com exceções padrão.
5. Resumo das Restrições
Instanciação de parâmetros de tipo: Não é possível instanciar diretamente, mas pode-se usar instâncias existentes.
Membros static: Não podem usar tipos genéricos da classe externa, mas métodos estáticos podem definir seus próprios parâmetros genéricos.
Arrays genéricos: Não podem ser instanciados diretamente, mas referências genéricas com curingas são permitidas.
Exceções genéricas: Não podem ser criadas, mas podem ser simuladas usando classes normais.
Compreender essas limitações é essencial para projetar classes genéricas seguras e eficientes em Java.
Top comments (0)