Тип возвращаемого значения метода для выполнения нескольких интерфейсов

Можно ли указать метод, который возвращает объект, реализующий два или несколько интерфейсов?

Скажем, у нас есть следующие интерфейсы:

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 () .

РЕДАКТИРОВАТЬ:

Был бы признателен, если бы кто-нибудь мог объяснить почему подход дженериков не работает. Я этого просто не вижу.

18
задан Cœur 15 March 2018 в 10:18
поделиться