Можно ли указать метод, который возвращает объект, который реализует два или несколько интерфейсов?
Скажем, у нас есть следующие интерфейсы:
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()
.
EDIT:
Был бы признателен, если кто-томог бы объяснить, почему универсальный подход не работает.Я просто не вижу этого.