ダックタイピング?

またまた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とかあるから無理だよな?