Méthode hériter avec des types de retour non liés
-
13-12-2019 - |
Question
J'ai l'extrait de code suivant
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 {
}
}
Quand j'essaie de le compiler, j'ai eu une erreur.
Test.java:12: types Test.I2 and Test.I1 are incompatible; both define m(), but with unrelated return types.
Comment éviter cela?
La solution
Comme indiqué dans Java - Nom de la méthode Collision dans la mise en œuvre de l'interface Vous ne pouvez pas faire cela.
En tant que solution de contournement, vous pouvez créer une classe d'adaptateur.
Autres conseils
Il n'y a qu'un seul cas dans lequel cela fonctionnerait, qui est mentionné par xamde , mais non expliqué à fond.C'est lié à Types de retour Covariant .
Dans le JDK 5, le covariant revient là où il est ajouté et, en tant que tel, il s'agit d'un cas valide qui compilerait bien et fonctionnerait sans problèmes.
public interface A {
public CharSequence asText();
}
public interface B {
public String asText();
}
public class C implements A, B {
@Override
public String asText() {
return "C";
}
}
Par conséquent, les suivants seront exécutés sans erreurs et imprimer "C" à la sortie principale:
A a = new C();
System.out.println(a.asText());
Cela fonctionne parce que la chaîne est un sous-type de charcuternence.
Ceci est un bug dans le compilateur Java 6 de Sun .
J'ai eu le même problème et cela semble bien en utilisant le JDK 7 de Oracle.