JavaでGenericsを使ってStructual Subtypingできたよー

Structual Subtypingは、OCamlとかScalaとかにもあるらしい、アレです。

方針

  • 一つのインタフェースに一つのメソッドが定義される。
  • インタフェースの継承は禁止。
  • 利用側(今回はHogeクラスのhogeメソッド)では、必要なメソッドを持つ総称型として引数を受ける。

コード

interface Foo {
    public String foo();
}

interface Bar {
    public String bar();
}

interface Baz {
    public String baz();
}

class FooBarImpl implements Foo,Bar {
    public String foo() {
        return "ふー";
    }

    public String bar() {
        return "ばー";
    }
}

public class Hoge {
    public <FooBar extends Foo & Bar> void hoge(FooBar foobar) {
        System.out.println(foobar.foo());
        System.out.println(foobar.bar());
    }
    
    public static void main(String[] args) {
        new Hoge().hoge(new FooBarImpl());
    }
}

出力結果

ふー
ばー

んー、

できたよー、って言ってもいいんでしょうか?
実装クラスは、あらかじめインタフェースを指定しなければならないっていう縛りはある。
このコードは極端だとしても、ある程度細か目(メソッド数個程度?)にインタフェースを定義してやりつつクラスのimplementに追加してあげれば、柔軟な対応が出来そうな気がします。基本は、インタフェース継承禁止。