Java GenericsによるDuck Typing

JavaGenericsで同様なことをやろうとした。

class Duck {
    public void quack() { System.out.println("gaaa"); }
}

class Foo {
    public void quack() { System.out.println("...."); }
}

class test {
    public static <T> void func(T ducky) {
        ducky.quack();
        //System.out.println(ducky.getClass());
    }

    public static void main(String[] args) {
        func(new Duck());
        func(new Foo());
    }
}

コンパイル時にduckyの型がObject型と認識されてquack()メソッドが見つからないというエラーが出た。ducky.quack()をコメントアウトして、逆コンパイラJadを使って確認してもTがObject型になっている。test.func(new Duck())としても同様。変換規則がいまいち分かっていない。この手の問題のJavaでの回避方法はどうするのだろうか?


追記:
odzさんが2006/09/01の日記で「あと、Java では無理な Duck Typing も template なら可能だったり。」と書かれていた。仕組みはまだ分かっていないがJavaでできないのは残念。