Можно ли указать метод, который возвращает объект, реализующий два или несколько интерфейсов?
Скажем, у нас есть следующие интерфейсы:
interface FooBar {
[Foo] & [Bar] getFooBar();
}
interface Foo {
void doFoo();
}
inteface Bar {
void doBar();
}
Реализации FooBar
должны предоставить метод getFooBar()
, который возвращает экземпляр типа fullfills Foo
, а также Bar
.
То, что я пробовал до сих пор, это сделать с помощью дженериков:
interface FooBar {
<T extends Foo & Bar> T getFooBar()
}
class SomeImplementor implements FooBar {
private FooAndBarImpl fSomeField;
public <T extends Foo & Bar> T getFooBar() {
return fSomeField;
}
}
Учитывая, что FooAndBarImpl
- это некоторый тип, предоставляемый каркасом или библиотекой и реализующий Foo
и Bar
, это, я думаю, должно работать. Однако это не так, потому что "FooAndBarImpl не может быть преобразован в T". Почему это? Контракт, подразумеваемый getFooBar()
, не разбит, как я его вижу.
Другим решением было бы определить новый интерфейс, который расширяет Foo
и Bar
, и использовать это как возвращаемый тип. Я просто не вижу смысла возвращать пустую оболочку для fSomeField
в реализации getFooBar()
.
Спасибо за любые другие советы и/или объяснения.
EDIT:
Был бы признателен, если бы кто-нибудь мог объяснить, почему подход дженериков не работает. Я просто этого не вижу.