Наследовать метод с несвязанными типами возврата

У меня есть следующий фрагмент кода

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.

Другие вопросы по тегам