Generics と template

Generics で Duck type は無理です。
基本的には kinaba さんが書かれている通りで。

Dのテンプレートは、仕組み的には C++ のそれと全く同じです。引数の違う実体は全部別のインスタンスとして、コンパイル時にマクロ的に展開されます。型チェックも、JavaC#ジェネリクスのようなテンプレートの段階での型チェックは入らなくて、実際にmixinや関数適用の形で使った時点で初めて型チェックが行われます。

C++/D*1 の template は実際に使われたときに、その型ごとに実装を生成してから、型チェックという具合になるわけだけど、Java/C#*2Generics ではそういう実装の生成はなくて、単に前後に cast が入ったりするだけ。
だから

public static <T> void func(T ducky) {
    ducky.quack();
}

はメソッドの実装時の情報だけで型チェックが入って、ducky の型は Object とみなされてエラーになると。
もちろん、

interface Duck {
    void quack();
}

class test {
    static <T extends Duck> void func(T ducky) {
        ducky.quack();
    }
}

なんかは OK だけど、これは普通に継承関係を使って型チェックが入っているわけで、Duck Typing と呼ぶような代物ではないよね。

*1:実は D のことはほとんど知らないんだけど

*2:これまた C# のことは良く知らない