u-ryo's blog

various information for coding...

Category: Lambda

Illegal Forward Reference

| Comments

Javaの珍しいcompile error messageに、 illegal forward referenceというのがあります。 これを題材に、後輩氏に課題を出しました。

最も単純な形にして挙例すると、

1
2
3
4
5
6
7
8
9
10
import java.util.function.Function;
class Test {
    Function f = new Function() {
            @Override
            public Object apply(Object t) {
                return o;
            }
        };
    Object o;
}

↑これをlambda式に直しなさい、といったようなものです。

実はこれ、単純にlambda式にすると、compile errorになります。

1
2
3
4
5
6
7
8
9
class Test {
    java.util.function.Function f = t -> o;
    Object o;
}
$ javac /tmp/Test.java
/tmp/Test.java:2: error: illegal forward reference
    java.util.function.Function f = t -> o;
                                         ^
1 error

error messageからしてどう直せばいいかは自明かと思ったんですが、 英語が不自由な後輩氏の1日弱かけた答えはこうでした。

1
2
3
4
class Test {
    java.util.function.Function f = t -> o;
    static Object o;
}

流石に「何でもかんでもstaticにすればいいってもんじゃない」 ってことはわかってて、「これがFA」とまでは言ってませんでしたけど、 ここをみて、 「staticにすればいいんじゃね、って書いてある」と思ったんだそう。 そうは書いてないんだけどなー。

でも、こういう回答は想像してなくて、新鮮でした。

そもそもdeclarationが後ろに書いてあったこと自体がおかしい、とは思いますけどね。 そういう「色々おかしい」ソフトを直しています。