LoginSignup
9
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-30

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のようなことができるようになりました。

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

9
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10