Можно ли указать метод, который возвращает объект, реализующий два или несколько интерфейсов?
Скажем, у нас есть следующие интерфейсы:
interface FooBar {
[Foo] & [Bar] getFooBar();
}
interface Foo {
void doFoo();
}
inteface Bar {
void doBar();
}
Разработчики FooBar
должны предоставить метод getFooBar()
, который возвращает экземпляр типа, который заполняет 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()
.
ИЗМЕНИТЬ:
Был бы признателен, если бы кто-нибудь мог объяснить, почему подход дженериков не работает. Я просто не вижу этого.