今日も Java 8 に備えて良く解らないけど未来のコードと戯れたいと思います。
今回は、Functional Interface と Virtual Extension Methods を試してみたいと思います。
ただ、@FunctionalInterface の使い方がこれであっているのか?解りません(>_<。)
@FunctionalInterface を消しても同じようにコンパイル、実行できてしまうんですよね~
@Override なんかと同じでただの注釈なのかなぁ・・・
メリットが良く解らんぜよw
Virtual Extension Methods は以前にも試したんだけど default キーワードのつく位置が変わったの(決められた)のかな。
さて、それでは試してみます。
| jp\yucchi\myfunctionalinterface\MyFunctionalInterface.java |
package jp.yucchi.myfunctionalinterface;
public class MyFunctionalInterface {
@FunctionalInterface
private interface FuncInterface {
public void hoge(); // 対象メソッド
@Override
public String toString(); // あっても関係ないね
@Override
public boolean equals(Object o); // あっても関係ないね
}
@FunctionalInterface
private interface CompFuncInterface extends FuncInterface {
// Virtual Extension Methods
default public void foo() {
System.out.println("foo");
}
// Virtual Extension Methods
default public void bar() {
System.out.println("bar");
}
}
public static void main(String[] args) {
chome(() -> {
System.out.println("hoge");
});
}
private static void chome(CompFuncInterface cfi) {
cfi.hoge();
cfi.foo(); // Virtual Extension Methods
cfi.bar(); // Virtual Extension Methods
}
}
実行結果は次のとおりです。
run:
hoge
foo
bar
BUILD SUCCESSFUL (total time: 0 seconds)
実行結果からみて Functional Interface の動作は定義されているとおりに問題なく動いているようです。
Functional Interface の定義については長くなりますのでググってみてください。
日本語で詳しく説明されているサイトが見つかるはずです。
今回のプログラムでは
@Override public String toString(); // あっても関係ないね @Override public boolean equals(Object o); // あっても関係ないね
Object クラスのこの二つのメソッドがあっても問題ないこと、
// Virtual Extension Methods
default public void foo() {
System.out.println("foo");
}
// Virtual Extension Methods
default public void bar() {
System.out.println("bar");
}
この Virtual Extension Methods の default 実装があっても Functional Interface の機能を問題なく実行できることを証明しました。
ちゃんとラムダ式で動いてます。(^_^)
chome(() -> {
System.out.println("hoge");
});
}
実行結果からちゃんと二つの Virtual Extension Methods も動いているのが解ります。
Java 8 の正式リリースが楽しみですね(*^▽^*)
@FunctionalInterface が記述してあれば FunctionalInterface の条件が満たされてない場合、コンパイルエラーとなって解るようです。NetBeans を使っていればコーディング中に即座にアラートが出ます。