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でできないのは残念。

メタプログラミング

わなDの"Template in D"項の最後の締めで、

つまり、「文字列処理する関数を普通のD言語で書く」「コンパイル時にはガンガン文字列処理」「最後にmixinでコード生成」というスタイルのメタプログラミング

とあったがD言語が活躍できる開発ってどういうのがあるのだろう?開発サイクルの短いゲーム系かな?しかし、Dの機能はすごすぎる…。