昨日(4月26日)富山で行われたJava 8 勉強会にて、
日経ITProの桜庭さんより講義を受けたなかでで、
ラムダ式のスコープについての説明があって、
無名クラスとラムダ式の相違の説明がありました。
<引用元>
----<引用:ここから>----
public class LambdaTest {
@FunctionalInterface
interface Function {
void func();
// デフォルトメソッドによる実装
default void printClass() {
System.out.println("Function");
}
}
// Function#printClassと同じシグネチャのメソッド
private void printClass() {
System.out.println("LambdaTest");
}
public LambdaTest() {
Function func1 = new Function() {
@Override
public void func() {
printClass();
}
};
Function func2 = () -> printClass();
func1.func();
func2.func();
}
public static void main(String... args) throws Exception {
new LambdaTest();
}
}
----<引用:ここまで>----
このソースの結果は以下の通り
----<引用:ここから>----
>java LambdaTest
Function
LambdaTest
----<引用:ここまで>----
と、ここで、
「ラムダ式から、デフォルトメソッドを呼ぶにはどうしたらいいか?」
と質問があったのですが、その場では記法はわかりませんでした。
「まあ、帰ってから調べよう」と思っていたのですが、
「もしかしたらデフォルトメソッドが呼べないのではないか」
と思うようになりました。
----<作ったソース:ここから>----
public class Test {
@FunctionalInterface
interface Bar {
void bar();
default void hoho() {
System.out.println("BAR");
}
}
/* 動作確認してから、このメソッドをコメントにした。
void hoho() {
System.out.println("HOHO");
}
*/
void test() {
Bar b = () -> { hoho(); };
b.bar();
}
public static void main(String[] args) {
Test t = new Test();
t.test();
}
}
----<作ったソース:ここまで>----
これをコンパイルすると、
----<コンパイル結果:ここから>----
>javac Test.java
Test.java:15: エラー: シンボルを見つけられません
Bar b = () -> { hoho(); };
^
シンボル: メソッド hoho()
場所: クラス Test
エラー1個
----<コンパイル結果:ここまで>----
コンパイラが「名前解決できない」と返してきました。
この結果から、デフォルトメソッドが呼べないのではないかと疑っています。
どなたか識者のかた、この疑問に回答いただけませんでしょうか?