К сожалению, нет юридического актера, который вы можете сделать, чтобы удовлетворить эту ситуацию. Для реализации всех необходимых вам интерфейсов в качестве границ должен быть известен один тип, чтобы вы могли использовать его. Это может быть тип, который вы создаете для этой цели, или какой-то существующий тип.
interface Baz extends Foo, Bar { }
public void caller(Object w) {
doSomething((Baz) w);
}
Если известны другие типы, такие как Baz
, для определения границ, вы можете проверить эти типы и иметь в вызывающей стороне ветвь, которая вызывает doSomething
с приведением к этим типам. Это не красиво.
Вы также можете использовать делегирование, создав собственный класс Baz
, который соответствует границам, требуемым для doSomething
. Затем оберните объект, который вам передан, в экземпляр вашего Baz
класса и передайте эту оболочку doSomething
.
private static class FooBarAdapter implements Foo, Bar {
private final Object adaptee;
FooBarAdapter(Object o) {
adaptee = (Foo) (Bar) o;
}
public int flip() { return ((Foo) adaptee).flip(); }
public void flop(int x) { ((Foo) adaptee).flop(x); }
public void blort() { ((Bar) adaptee).blort(); }
}
public void problemFunction (Object o) {
doSomething(new FooBarAdapter(o));
}