gpt4 book ai didi

java - 为什么我们不能直接在 Lambda 函数中调用 Thread#sleep()?

转载 作者:IT老高 更新时间:2023-10-28 20:23:19 25 4
gpt4 key购买 nike

下面的代码给了我一个编译时错误:

Thread t2 = new Thread(() -> {
try {
sleep(1000);
}
catch (InterruptedException e) {}
});

The method sleep(int) is undefined for the type A (where A is my class name).

然而,当我使用匿名内部类时,没有编译时错误:

Thread t1 = new Thread(){
public void run(){
try {
sleep(1000);
} catch (InterruptedException e) {}
}
};

下面的代码也可以正常工作:

Thread t3 = new Thread(() -> System.out.println("In lambda"));

在 lambda 表达式主体中是如何工作的?请帮忙。

从许多答案中,我可以看到在我的第一种方法中使用 Thread.sleep(1000) 可以解决该错误。但是,如果有人能向我解释作用域和上下文如何在 lambda 表达式中工作,我将不胜感激。

最佳答案

Thread.sleepThread 类中的静态方法。

您可以在匿名类中直接调用 sleep 而无需任何限定符的原因是因为您实际上处于从 Thread 继承的类的上下文中。因此,sleep 可以在那里访问。

但是在 lambda 的情况下,你不在一个继承自 Thread 的类中。您在围绕该代码的任何类中。所以sleep不能直接调用,需要说Thread.sleepdocumentation也支持这个:

Lambda expressions are lexically scoped. This means that they do not inherit any names from a supertype or introduce a new level of scoping. Declarations in a lambda expression are interpreted just as they are in the enclosing environment.

基本上就是说,在 lambda 内部,您实际上与处于 lambda 外部的范围相同。如果你不能在 lambda 之外访问 sleep ,你也不能在里面。

另外,请注意,您在此处显示的创建线程的两种方法本质上是不同的。在 lambda 中,您将 Runnable 传递给 Thread 构造函数,而在匿名类中,您通过创建 Thread它的一个匿名类。

关于java - 为什么我们不能直接在 Lambda 函数中调用 Thread#sleep()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52602990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com