またまたscalaの記事
ダックタイピングというエントリーだが、scalaにダックタイピングはない。Structural Subtypingである。
コップ本には載っていないので、最近まで知らなかったが、こんな機能があったのか・・・
http://d.hatena.ne.jp/taichitaichi/20080319/1205926103
てか、Matzもずいぶん前に紹介してるんだね(-д-;)
http://www.rubyist.net/~matz/20071122.html#p01
で、確かに、リフレクションは使っているし、結局コンパイル時に型チェック必要で、ダックタイピングとは程遠い感じはするので、使い道が思い当たらないなぁ・・・trait定義(Javaでのインターフェイス代わりとして、関数は全部abstractで)した方が分かりやすそうだし、手間も変わらないし。
closeってメソッド持っているクラスを引数にしたい場合で、でも既存のクラスはインターフェイス実装してないけど、既存のクラスを継承とか、暗黙の型変換とかせずに、そのまま使いたいって場合とかかなぁ?
あとはリフレクション使っている理由だが・・・
コンパイル時にチェックはしているんだから、メソッドは存在してるハズだし、呼び出しに失敗するハズはない
↓
でもインターフェイス実装してないから、JVMの仕様上、直接呼び出せない
↓
だから仕方なく、リフレクションで呼び出し
ってことかな?あくまで、個人的な予想だが。この辺はJVM上というのが不利になって、効率の悪い実装になっている点かなぁ?
OCamlとかは、もっと綺麗に型推論してくれたり、最初からこういう仕組みが考えられているだろうから。
そう考えると、JRubyとかを逆コンパイルしてみたらどうなってるんだろ。リフレクションだらけなのか?それともコンパイル時にだいたい決まるのかな?でもevalとかあるから無理だよな?