DEV Community

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)