Re: [北陸エンジニア] java 8 ラムダ式はインタフェースのデフォルトメソッドを呼べない??

50 views
Skip to first unread message

yuhki nagise

unread,
May 1, 2014, 6:32:31 AM5/1/14
to 北陸エンジニアグループ, Yuichi Sakuraba
To : 北陸エンジニアグループ
Cc : 櫻庭さん

なぎせです。

ラムダ道場のご参加ありがとうございました。

私も手が空いてなくて言語仕様の裏付け取れてないのですが、本件確認しようと思っています。
Java8の言語仕様のどこかに記載があると思うのですが…
http://docs.oracle.com/javase/specs/jls/se8/html/index.html

何か進展あれば連絡します。


---------- 転送メッセージ ----------
From: "堂垂毅志" <tdo...@gmail.com>
日付: 2014/04/27 10:37
件名: [北陸エンジニア] java 8 ラムダ式はインタフェースのデフォルトメソッドを呼べない??
To: <hokuriku...@googlegroups.com>
Cc:

昨日(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個
----<コンパイル結果:ここまで>----

コンパイラが「名前解決できない」と返してきました。
この結果から、デフォルトメソッドが呼べないのではないかと疑っています。

どなたか識者のかた、この疑問に回答いただけませんでしょうか?

--
このメールは Google グループのグループ「北陸エンジニアグループ」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには hokuriku_engin...@googlegroups.com にメールを送信してください。
このグループに投稿するには hokuriku...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/hokuriku_engineer からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages