Generics と template
Generics で Duck type は無理です。
基本的には kinaba さんが書かれている通りで。
Dのテンプレートは、仕組み的には C++ のそれと全く同じです。引数の違う実体は全部別のインスタンスとして、コンパイル時にマクロ的に展開されます。型チェックも、JavaやC#のジェネリクスのようなテンプレートの段階での型チェックは入らなくて、実際にmixinや関数適用の形で使った時点で初めて型チェックが行われます。
C++/D*1 の template は実際に使われたときに、その型ごとに実装を生成してから、型チェックという具合になるわけだけど、Java/C#*2 の Generics ではそういう実装の生成はなくて、単に前後に 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 と呼ぶような代物ではないよね。