Подтвердить что ты не робот

Как создать метод для приема экземпляров с двумя интерфейсами?

У меня есть пара интерфейсов:

public interface Speaker {
    void speak();
}

public inteface Walker {
    void walk();
}

Мне нужен метод, который принимает экземпляры, которые являются как Speaker, так и Walker.

Теперь я мог бы реализовать другой интерфейс:

public interface WalkerSpeaker extends Walker, Speaker {

}

И примите, что:

void walkAndTalk(final WalkerSpeaker x) {
    x.walk();
    x.speak();
}

Но это довольно громоздко для многих комбинаций, и каждая реализация должна наследовать от WalkerSpeaker, чтобы она работала!

Есть ли лучший способ?

4b9b3361

Ответ 1

Вы можете добиться этого с помощью дженериков следующим образом

public <T extends Speaker & Walker> void walkAndTalk(T x) {
    x.walk();
    x.speak();
}

Параметр типа T будет "дважды ограничен" для обоих интерфейсов, поэтому по существу T будет WalkerSpeaker, за исключением того, что вам не нужно писать для него отдельный интерфейс.