はじめての Lambda vol.3
JDK 8 で採用される予定の Lambda についていろいろ調べているんですが
今回は Virtual Extension Methods または Defender Methods と言われている?
新たな(都合の良い?)ものについて調べてみました。
インタフェースを実装する場合 JDK 7 までは全てのメソッドを実装する必要でしたよね。
JDK 8 ではデフォルト実装を定義できるらしいんです。
具体的には次のプログラムを見てください。
jp\yucchi\virtual_extension_method_1\Virtual_Extension_Method_1.java |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<font size="4"><span class="keyword-directive">package</span> jp.yucchi.virtual_extension_method_1; <span class="keyword-directive">interface</span> <span class="ST0">Hello</span> { <span class="keyword-directive">void</span> <span class="ST0">sayHello</span>(); <span class="keyword-directive">void</span> <span class="ST0">sayHelloDefaulter</span>() <span class="keyword-directive">default</span> { System.<span class="ST1">out</span>.println(<span class="character">"</span><span class="character">Default from interface : Hello World!</span><span class="character">"</span>); } } <span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST0">Virtual_Extension_Method_1</span> { <span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> <span class="ST2">main</span>(String[] args) { HelloImplementer helloImpl = <span class="keyword-directive">new</span> HelloImplementer(); helloImpl.sayHello(); helloImpl.sayHelloDefaulter(); } } <span class="keyword-directive">class</span> <span class="ST0">HelloImplementer</span> <span class="keyword-directive">implements</span> Hello { @Override <span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">sayHello</span>() { System.<span class="ST1">out</span>.println(<span class="character">"</span><span class="character">Hello World!</span><span class="character">"</span>); } @Override <span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">sayHelloDefaulter</span>(){ System.<span class="ST1">out</span>.println(<span class="character">"</span><span class="character">Defautler overridden from class : Hello World!</span><span class="character">"</span>); } }</font> |
それでは実行させてみます。
ちゃんとオーバーライドされてますね!(^^)
なかなか面白いですね。
この Virtual Extension Methods は Lambda を実装するのにおまけではなく
必要不可欠な実装らしいです。
私は Lambda のことはまだほとんど解りませんが JDK 8 がリリースされるのが少し楽しみになってきました。(*^_^*)
TAGS: Java | 2012年5月25日5:56 AM | Comment : 0