Pergunta

Eu tenho o seguinte trecho de código

public class Test {
    static interface I1 { I1 m(); }

    static interface I2 { I2 m(); }

    static interface I12 extends I1,I2 { I12 m(); }

    public static void main(String [] args) throws Exception {
    }
}

Quando tento compilá-lo, recebo um erro.

Test.java:12: types Test.I2 and Test.I1 are incompatible; both define m(), but with unrelated return types.

Como evitar isso?

Foi útil?

Solução

Como discutido em Java – Colisão de nomes de métodos na implementação de interface você não pode fazer isso.

Como solução alternativa, você pode criar uma classe de adaptador.

Outras dicas

Há apenas um caso em que isso funcionaria, mencionado por xamde, mas não completamente explicado.Está relacionado a tipos de retorno covariantes.

No JDK 5, a covariante retorna onde foi adicionada e, como tal, o seguinte é um caso válido que seria compilado corretamente e executado sem problemas.

public interface A {
    public CharSequence asText();
}

public interface B {
    public String asText();
}

public class C implements A, B {

    @Override
    public String asText() {
        return "C";
    }

}

Portanto, o seguinte será executado sem erros e imprimirá "C" na saída principal:

A a = new C();
System.out.println(a.asText());

Isso funciona porque String é um subtipo de CharSequence.

Eu tive o mesmo problema e parece estar tudo bem usando o JDK 7 da Oracle.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top