gpt4 book ai didi

java - 在 JavaFX WorkerStateEvent 上编译 lambda 时出错

转载 作者:行者123 更新时间:2023-11-29 05:08:47 25 4
gpt4 key购买 nike

此代码无法使用 javac JDK8 编译器进行编译。

public class Test extends Application {

public static void main(String[] args) {
launch(Test.class);
}

@Override
public void start(Stage primaryStage) throws Exception {
Service service = new Service() {
@Override
protected Task createTask() {
return null;
}
};
service.setOnFailed(event -> System.out.println(event.getSource().getException().toString()));
}
}

错误是

java: cannot find symbol
symbol: method getException()
location: class java.lang.Object

IntelliJ 告诉我一切正常,如果我在 event.getSource() 上手动添加强制转换,编译工作正常,但 Intellij 告诉我强制转换是多余的。

是否存在 Intellij 错误?我使用最新版本的 Intellij Ultimate (14.1.1)。

最佳答案

对于这个具体案例,我实际上会以不同的方式编写。您已经知道触发事件的来源是什么;这是 service您在其上注册了监听器。所以你可以这样做

service.setOnFailed(event ->
System.out.println(service.getException().toString());

我不太明白为什么编译器不能从你的代码中推断出类型,但如果你正确地键入服务,为其泛型类型提供参数,那么它编译得很好:

import javafx.application.Application;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.stage.Stage;


public class ServiceTest extends Application{

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {
Service<Void> service = new Service<Void>() {
@Override
protected Task<Void> createTask() {
return null;
}
};
service.setOnFailed(event ->
System.out.println(event.getSource().getException().toString()));
}

}

您的代码中显然有足够的信息供编译器推断出 event类型为 WorkerStateEvent ,这应该允许您调用 event.getSource().getException() .我认为当您使用原始类型 ( Service ) 而不是一般类型的对象 ( Service<Void> 等) 时,类型推断会因某种原因而失败。

关于java - 在 JavaFX WorkerStateEvent 上编译 lambda 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29459886/

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