Java

Java 10 で導入されたintersection型がスゴイ(?)

Java 10 ではvarという、型推論による変数宣言が可能になりました。
例えば、
var url = new URL("http://ukiuni.com");
とかすると、urlが型推論され、URL型の変数となります。

ここまでだと、「へぇ。変数の記述を省略できるシンタックスシュガーなのね。」で話が終わるのですが、Java 10 の型推論では、「表現不可能な型も推論できる」ようになっています。

。。。な…何を言っているのかわからねーと思うが、俺も何だかわからねー。

サンプルコードを示します。

Sample.java
public class Sample{
  public static void main(String[] args) {
    var ins = (Foo & Bar) ()->{};
    ins.foo();
    ins.bar();
    ins.forFunctionalInterfaceMethod(); //☓ 実装なくても呼べる →コメントを頂き訂正。3行上の()->{} が実装。
    ins.toString(); //Object型でもある。
  }

  interface Base {
    void forFunctionalInterfaceMethod();
  }

  interface Foo extends Base {
    default void foo() {
      System.out.println("foo");
    }
  }

  interface Bar extends Base {
    default void bar() {
      System.out.println("bar");
    }
  }
}

これをJava 10 でコンパイル、実行すると、こんな出力です。

$ javac Sample.java  && java Sample
foo
bar

つまり、
var ins = (Foo & Bar) ()->{};
のinsは、Foo型でもあり、Bar型でもあり、更にはそのインターフェースの親であるBase型でもあり、Object型でもある、という型になるのです。これが、「表現不可能な型」の、intersection型です。
これで動的Mixinのようなことができるようになりました。

。。。どういうケースで便利に使えるのでしょう。。。
見聞をお持ちの方、コメントをお願いします。