9

次のクラスを検討してください。

class Foo<T> {

    void handle(T t) {
        System.out.println("handling " + t);
    }

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);

        Foo<Integer> f = new Foo<>();

        list.forEach(f::handle);             // compiles fine
        //list.forEach(obj -> f.handle(obj));// compilation error

        f = new Foo<>(); // reassign f

    }
}

ではコンパイル エラーが発生するのにobj -> f.handle(obj)、では発生しないのはなぜf::handleですか?

4

2 に答える 2

15

これらは、2 つの異なることを行う 2 つの異なる構造です。最初のケースでは、特定のオブジェクトのメソッド参照を取得しています。これは 1 回だけ実行する必要があり、その後、JVM はオブジェクトへの独自の参照 (事実上最終) を持ち、メソッドfを呼び出すことができます。handle2 番目のケースでは、呼び出しのたびに JVM はf参照を解決する必要があるため、それが である必要があると不平を言いfますfinal。の実行中に に設定fするコードを簡単に記述して、NPE を引き起こす可能性があります。nullforEach

于 2014-12-22T21:00:05.280 に答える