JDK 8 で採用される予定の Lambda についていろいろ調べているんですが
今回は Virtual Extension Methods または Defender Methods と言われている?
新たな(都合の良い?)ものについて調べてみました。
インタフェースを実装する場合 JDK 7 までは全てのメソッドを実装する必要でしたよね。
JDK 8 ではデフォルト実装を定義できるらしいんです。
具体的には次のプログラムを見てください。
| jp\yucchi\virtual_extension_method_1\Virtual_Extension_Method_1.java |
package jp.yucchi.virtual_extension_method_1;
interface Hello {
void sayHello();
void sayHelloDefaulter() default {
System.out.println("Default from interface : Hello World!");
}
}
public class Virtual_Extension_Method_1 {
public static void main(String[] args) {
HelloImplementer helloImpl = new HelloImplementer();
helloImpl.sayHello();
helloImpl.sayHelloDefaulter();
}
}
class HelloImplementer implements Hello {
@Override
public void sayHello() {
System.out.println("Hello World!");
}
}
今までだったら sayHelloDefalter() メソッドを HelloImplementer クラスが実装していないので
コンパイルエラーになったはずですよね。
JDK 8 ではメソッドに defalt キーワードを付けることによって
デフォルト実装されます!
実際に動かしてみました。
ちゃんと動いてます。
もちろん、デフォルト実装されたメソッドも!
ここでちょっと疑問が・・・
デフォルト実装されたメソッドってオーラーライドできるの?
コードを次のように変更しました。
| jp\yucchi\virtual_extension_method_1\Virtual_Extension_Method_1.java |
package jp.yucchi.virtual_extension_method_1; interface Hello { void sayHello(); void sayHelloDefaulter() default { System.out.println("Default from interface : Hello World!"); } } public class Virtual_Extension_Method_1 { public static void main(String[] args) { HelloImplementer helloImpl = new HelloImplementer(); helloImpl.sayHello(); helloImpl.sayHelloDefaulter(); } } class HelloImplementer implements Hello { @Override public void sayHello() { System.out.println("Hello World!"); } @Override public void sayHelloDefaulter(){ System.out.println("Defautler overridden from class : Hello World!"); } }
それでは実行させてみます。
ちゃんとオーバーライドされてますね!(^^)
なかなか面白いですね。
この Virtual Extension Methods は Lambda を実装するのにおまけではなく
必要不可欠な実装らしいです。
私は Lambda のことはまだほとんど解りませんが JDK 8 がリリースされるのが少し楽しみになってきました。(*^_^*)