う~ん、結論から言うと書けません。以上。っていうのもアレなんで試してみました。
public class Test{
public static interface Hogeable{
void hoge();
}
public static void test(Hogeable hogeable){
hogeable.hoge();
}
public static class Foo{
public void hoge(){
System.out.println("Foo");
}
}
public static class Bar{
public void hoge(){
System.out.println("Bar");
}
}
public static void main(String[] args){
final Foo foo = new Foo();
final Bar bar = new Bar();
test(new Hogeable(){
public void hoge(){
foo.hoge();
}
});
test(new Hogeable(){
public void hoge(){
bar.hoge();
}
});
}
}
結論から言うとAdaptorパターンになります。Javaのようなガチガチな静的言語では型を合わせるためのアダプタが必要なのです。本来は型をあわせるべきなんですね。
単発的なコードでは面倒でやりませんが、たまにプロジェクトの自前フレームワークで必要になったときはProxyパターンとAdaptorパターンを利用して、動的なAdaptorをリフレクションで生成するようにしています。でも大抵型をあわせることで対処するので、必要になるケースは少ないかな・・・
JavaScriptみたいに型がない言語なら楽なんですけどね。