Как создать метод для приема экземпляров с двумя интерфейсами?
У меня есть пара интерфейсов:
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
, чтобы она работала!
Есть ли лучший способ?
Ответы
Ответ 1
Вы можете добиться этого с помощью дженериков следующим образом
public <T extends Speaker & Walker> void walkAndTalk(T x) {
x.walk();
x.speak();
}
Параметр типа T
будет "дважды ограничен" для обоих интерфейсов, поэтому по существу T
будет WalkerSpeaker
, за исключением того, что вам не нужно писать для него отдельный интерфейс.