Javaでmixinを実現する方法

先日書いた方法と同じアイデアを使うと、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年前にやっておけば、東大の博士号がもらえるのか。