DEV Community

Restrições ao Uso de Genéricos

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!
    }
}

Enter fullscreen mode Exit fullscreen mode
  • 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;
    }
}

Enter fullscreen mode Exit fullscreen mode

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;
}

Enter fullscreen mode Exit fullscreen mode

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!

Enter fullscreen mode Exit fullscreen mode
  • 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!

Enter fullscreen mode Exit fullscreen mode

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.

Enter fullscreen mode Exit fullscreen mode
  • Use curingas
Gen<?> gens[] = new Gen<?>[10]; // Correto.

Enter fullscreen mode Exit fullscreen mode

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;
}

Enter fullscreen mode Exit fullscreen mode

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)