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