快速 Java 匿名函数/类问题

tha*_*pNB 2 java lambda multithreading anonymous-class java-8

我知道匿名函数在 JS 中是如何工作的,并且对 Java 中的部分内容有点困惑。

所以在下面我有一个匿名类(我只是使用 Thread 类作为我所看到的示例),在那里我覆盖了run()函数,然后在该类上调用.start()。

new Thread() {
    @Override
    public void run() {
        System.out.println("Hello from the anonymous class thread");
    }
}.start();
Run Code Online (Sandbox Code Playgroud)

所以这是有效的,但 IntelliJ 想让我把它改写成这样:

new Thread(() -> System.out.println("Hello from the anonymous class thread")).start();
Run Code Online (Sandbox Code Playgroud)

我得到了大部分这种语法,但对如何覆盖run()函数有点困惑。根据我的理解,没有参数被传递到 Thread 类(所以没有任何参数被传递到我假设的构造函数中)。现在我感到困惑的地方就在这里。它没有在任何地方声明它覆盖了run()函数。这是Thread类的特例还是我遗漏了什么?

希望我清楚地解释了这一点,并提前致谢!

Swe*_*per 6

IntelliJ 向您建议的语法并不是原始代码的“倾斜”翻译,实际上并没有Thread.run像原始代码那样覆盖。

您原来的代码创建一个匿名子类Thread与run覆盖,而拟议的语法被调用的IntelliJ此构造的Thread一个接受Runnable。lambda 表达式代表Runnable. 如果我们将 lambda 表达式“扩展”为一个匿名类,我们实际上会这样做:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello from the anonymous class thread");
    }
}).start();
Run Code Online (Sandbox Code Playgroud)

因此,我们正在创建 的匿名实现Runnable,并Runnable.run改为实现。

它没有在任何地方说明它正在覆盖该run()功能。

没错,但它run是Runnable接口中唯一的抽象方法,因此 Java 能够确定您正在覆盖该方法。