Наследовать метод с несвязанными типами возврата
У меня есть следующий фрагмент кода
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 {
}
}
Когда я пытаюсь его скомпилировать, я получаю сообщение об ошибке.
Test.java:12: types Test.I2 and Test.I1 are incompatible; both define m(), but with unrelated return types.
Как этого избежать?
4 ответа
Как обсуждалось в Java - Столкновение имени метода в реализации интерфейса, вы не можете сделать это.
В качестве обходного пути вы можете создать класс адаптера.
Есть только один случай, в котором это сработало бы, о котором упоминает xamde, но который подробно не объясняется. Это связано с ковариантными типами возврата.
В JDK 5 ковариант возвращается, где он добавлен, и, как таковое, следующее является допустимым случаем, который прекрасно скомпилировался бы и работал бы без проблем.
public interface A {
public CharSequence asText();
}
public interface B {
public String asText();
}
public class C implements A, B {
@Override
public String asText() {
return "C";
}
}
Следовательно, следующее будет выполнено без ошибок и выведет "C" на основной вывод:
A a = new C();
System.out.println(a.asText());
Это работает, потому что String является подтипом CharSequence.
У меня была та же проблема, и, кажется, все в порядке, используя JDK 7 от Oracle.