DEV Community

FUNDAMENTOS JAVA
FUNDAMENTOS JAVA

Posted on

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.

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more