Почему это в анонимном внутреннем классе представляет другой объект, который в лямбда

как читать

Лямбда-выражение устраняет необходимость в анонимном классе и предоставляет Java очень простые, но мощные возможности функционального программирования.

что я понимаю, что лямбда - это замена внутренних классов одним методом для устранения громоздкости кода

public class Main {

    interface Foo {
        int x = 20;
        void bar();
    }

    public static void main(String[] args) {
        Main app = new Main();
        app.start();
    }

    int x = 10;

    public void start()
    {
        Main test = new Main();
        test.test(new Foo()
        {
            @Override
            public void bar() {
                System.out.println("Inner Class X= " + this.x);
            }
        });

        test.test(() -> System.out.println("Lambda X= " + this.x));
    }

    public void test(Foo foo) {
        foo.bar();
    }

}

вывод, который я получаю,

Inner Class X = 20
Lambda X = 10

чего я ожидаю

Inner Class X = 20
Lambda X = 20

person Ali Faris    schedule 24.01.2018    source источник
comment
this относится к разным вещам в лямбде и анонимном классе. Почему? Потому что именно так они определены в спецификации языка.   -  person Andy Turner    schedule 24.01.2018
comment
оба раза вы вызывали это, это было в рамках другого класса.   -  person Stultuske    schedule 24.01.2018
comment
Помимо всего прочего, x является статическим для Foo, поэтому не пытайтесь ссылаться на него через экземпляр.   -  person Andy Turner    schedule 24.01.2018
comment
Соответствующая языковая спецификация цитата: значение, обозначенное this в теле лямбда, совпадает со значением, обозначенным this в окружающем контексте.   -  person Andy Turner    schedule 24.01.2018


Ответы (1)


Учтите, что лямбда не является объектом.

В вашей первой реализации вы создаете объект внутреннего класса, выполняя new Foo(). Таким образом, в этой реализации this относится к этому объекту.

В лямбда-реализации нет такого объекта, который this относится к охватывающему классу.

person Prim    schedule 24.01.2018