先日書いた方法と同じアイデアを使うと、RubyのmixinをJavaで実現することが可能になりそうです。
つまり
module Eachable for List{ void each(Closure c){ for(Object o : this){ c(o); } } }
みたいなことを書いて
class EachableList extends ArrayList mixin Eachable{ }
とかすると
EachableList e = new EachableList(); e.each({print item;});
みたいなことを書ける。
実際にはEachableモジュールはinterfaceと、実装をもったクラスになって、メソッドはstaticメソッドになる。
public interface Eachable{ void each(Closure c); public static class Impl{ static void each(List _this, Closure c){ for(Object o : _this){ c(o); } } } }
で、mixinしてる方のクラスはこんな感じ。
class EachableList extends ArrayList implements Eachable{ void each(Closure c){ Eachable.Impl.each(this, c); } }
あとはVariable型っていうメソッドやらフィールドを追加できる型を定義して、それにまつわる言語仕様とその実現方法を決めてやって、それぞれの仕様と既存の仕様の間の整合性を丁寧にとってやれば、Rubyの意味論的な機能をJavaに追加するのはそれほど難しくない気がします。
moduleとmixinについて、噂とUser's Guideの説明くらいしか知らないので、すげ〜誤解してるのかもしれませんけど。「Java mixin」でググれるJavaでのmixin実装を見てると自信がなくなってきた。インスタンスを混ぜ合わせるの?でもRubyの説明にはmoduleはインスタンスをもてないってかいてあるし・・・
っていうか2年前にやっておけば、東大の博士号がもらえるのか。