为什么 java lambda 表达式可以使用“this”关键字引用父类成员而匿名类不能?

问题描述 投票:0回答:1

在以下课程中:

public class ThreadTest {

    public static String name = "Member Accessed";
    
    
    public void run() {
    
        // Anonymous class
        Runnable r1 = new Runnable() { 
        
            @Override
            public void run() {
                System.out.println("Using Anonymous class, referencing this.name " + this.name);
            }
        };
        
        // lambda expression
        Runnable r2 = () -> {
            System.out.println("Using Lambda Expression, referencing this.name " + this.name);
        };
        
        new Thread(r1).start();
        new Thread(r2).start();
    }


    public static void main(String[] args) {
    
        ThreadTest tt = new ThreadTest();
        tt.run();

    }
}

为什么lambda表达式可以访问

this.name
,而匿名类不能?我知道对于匿名类,
this
引用匿名类范围,并且
name
在那里不存在。但是,lambda 表达式基本上是属于实现接口的匿名类的匿名方法。因此,从技术上讲,
this
还应该为 lambda 表达式引用匿名类。但不知何故,
this
设法引用了
name
.

为什么会这样?

java lambda this
1个回答
0
投票

首先,只要您引用实例而不是类变量,就解决这个问题:

public String name = "Member Accessed";

虽然每个 lambda 表达式都可以表示为一个匿名类,但它们的字节码不同,正如 Eliott Frisch said。我的知识不够丰富,无法提供更多细节,但我可以向您推荐 Brian Goetz 的一篇非常有趣的读物。可悲的是,只要原始链接不再处于活动状态,就只能通过此答案访问脚本:Lambda Translation Strategy.


反正匿名类可以通过使用

this
指定类名来指出外部类的实例变量。

Runnable r1 = new Runnable() {

    @Override
    public void run() {
        System.out.println("Using Anonymous class: " + ThreadTest.this.name);
    }
};
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.