DEV Community

FUNDAMENTOS JAVA
FUNDAMENTOS JAVA

Posted on

Erros de Ambiguidade com Genéricos

1. O Que São Erros de Ambiguidade?

  • Surgem quando o erasure transforma duas declarações genéricas aparentemente distintas em tipos idênticos, causando conflitos de compilação.
  • São especialmente comuns em cenários envolvendo sobrecarga de métodos.

2. Exemplo de Ambiguidade: Sobrecarga com Erasure

Código problemático:

class MyGenClass<T, V> {
    T ob1;
    V ob2;

    // Tentativa de sobrecarga
    void set(T o) {
        ob1 = o;
    }

    void set(V o) {
        ob2 = o;
    }
}

Enter fullscreen mode Exit fullscreen mode

Erro: A tentativa de sobrecarregar o método set() com base nos parâmetros genéricos T e V parece válida, mas causa ambiguidade.

3. Razões para a Ambiguidade

  • Primeiro Problema: T e V podem ser o mesmo tipo.

Exemplo:

MyGenClass<String, String> obj = new MyGenClass<>();

Enter fullscreen mode Exit fullscreen mode

Aqui, tanto T quanto V são substituídos por String, tornando as duas versões de set() idênticas.

Resultado:

  • O compilador não consegue distinguir entre os dois métodos.

Segundo Problema: Erasure reduz os tipos a Object.

  • Durante a compilação, ambos os métodos são transformados em:
void set(Object o) {
    // ...
}

Enter fullscreen mode Exit fullscreen mode

Isso elimina qualquer distinção entre T e V, tornando a sobrecarga impossível.

4. Por Que Isso Acontece?

  • O erasure remove as informações de tipo genérico, substituindo-as por seus tipos limites (ou Object, se nenhum limite for especificado).
  • No caso de set(T) e set(V), ambos acabam sendo tratados como set(Object) no código gerado pelo compilador.

5. Solução: Evitar Sobrecarga com Genéricos
Para resolver a ambiguidade, use nomes diferentes para os métodos.

Exemplo corrigido:

class MyGenClass<T, V> {
    T ob1;
    V ob2;

    void setOb1(T o) {
        ob1 = o;
    }

    void setOb2(V o) {
        ob2 = o;
    }
}

Enter fullscreen mode Exit fullscreen mode

Aqui, setOb1() e setOb2() são métodos distintos, eliminando o conflito.

6. Conclusão
Ambiguidades como essa ocorrem porque o erasure transforma parâmetros genéricos em tipos simples (Object).
Para evitar erros, siga estas práticas:

  • Evite sobrecarregar métodos com parâmetros genéricos.
  • Dê nomes diferentes aos métodos que manipulam tipos genéricos distintos. Entender o comportamento do erasure ajuda a prevenir esses problemas e a projetar classes genéricas de forma segura.

Top comments (0)

nextjs tutorial video

📺 Youtube Tutorial Series

So you built a Next.js app, but you need a clear view of the entire operation flow to be able to identify performance bottlenecks before you launch. But how do you get started? Get the essentials on tracing for Next.js from @nikolovlazar in this video series 👀

Watch the Youtube series