Metodo eredita con tipi di ritorno non correlati
-
13-12-2019 - |
Domanda
Ho il seguente snippet di codice
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 provo a compilarlo ho avuto errore.
..Test.java:12: types Test.I2 and Test.I1 are incompatible; both define m(), but with unrelated return types.
Come evitare questo?
Soluzione
Come discusso in Java - Metodo Nome Collisione nell'implementazione dell'interfaccia Non puoi farlo.
Come soluzione alternativa, è possibile creare una classe adattatore.
Altri suggerimenti
C'è solo un caso in cui questo funzionerebbe, che è menzionato da xamde , ma non spiegato completamente.È correlato a Tipi di ritorno Covariant .
Nel JDK 5 il Covariant ritorna dove aggiunto, e in quanto tale è un caso valido che si compilerebbe bene ed eseguire senza problemi.
public interface A {
public CharSequence asText();
}
public interface B {
public String asText();
}
public class C implements A, B {
@Override
public String asText() {
return "C";
}
}
.
Pertanto, il seguente funzionerà senza errori e stampa "C" all'uscita principale:
A a = new C();
System.out.println(a.asText());
.
funziona perché la stringa è un sottotipo di a pagamento.
Questo è un Bug in Sun's Java 6 Compiler .
Ho avuto lo stesso problema e sembra andare bene usando il JDK 7 da Oracle.