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のようなことができるようになりました。
。。。どういうケースで便利に使えるのでしょう。。。
見聞をお持ちの方、コメントをお願いします。