Рассмотрим следующий код:
public interface A {
public A another();
}
public interface B {
public B another();
}
public interface AB extends A,B {
public AB another();
}
Это приводит к ошибке компиляции на AB
:
типы B и A несовместимы; оба определяют другое(), но с несвязанные типы возврата
Я видел этот вопрос SO и следую примеру несовместимости в принятом ответе - i.e.
public interface C {
public void doSomething();
}
public interface D {
public boolean doSomething();
}
public interface CD extends C,D {
}
Однако в этом случае типы возврата были действительно несовместимы - тип возврата не может быть как void, так и boolean. Принимая во внимание, что в приведенном выше примере возвращаемый тип another()
AB
является как A
, так и B
, поэтому возможно реализовать оба расширенных интерфейса.
Кроме того, посмотрев JLS (8.4.8, 8.4.8.3, 8.4.8.4), я не совсем понимаю, почему мой пример выше незаконно. Может кто-нибудь объяснить это мне?
Во-вторых, существуют ли какие-либо решения/обходные пути для этого, кроме повторения контрактных требований A
или B
в AB
?