Herdar método com tipos de retorno não relacionados
-
13-12-2019 - |
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?
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.
Isto é um bug no compilador Java 6 da Sun.
Eu tive o mesmo problema e parece estar tudo bem usando o JDK 7 da Oracle.