gpt4 book ai didi

java - Lambda for JavaFX 任务

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:55:14 24 4
gpt4 key购买 nike

对于这段代码,编译器给我这个错误“Target Type of lambda expression must be an interface”:

Task<Iterable<Showing>> task = () -> sDAO.listFiltered();

listFiltered()的返回类型是 Iterable<Showing> .如何使用 Task与 lambda 的接口(interface)?

最佳答案

Task 是一个抽象类,不是接口(interface),所以不能直接用 lambda 表达式创建。

您通常只使用内部类来子类化 Task:

Task<Iterable<Showing>> task = new Task<Iterable<Showing>>() {
@Override
public Iterable<Showing> call throws Exception {
return sDAO.listFiltered();
}
});

如果您想要使用 lambda 表达式创建 Task 的功能,您可以创建一个可重用的实用程序方法来为您完成这项工作。由于您需要在 Task 中实现的抽象方法 callCallable 中的接口(interface)方法具有相同的签名,您可以执行以下操作:

public class Tasks {

public static <T> Task<T> create(Callable<T> callable) {
return new Task<T>() {
@Override
public T call() throws Exception {
return callable.call();
}
};
}
}

由于 Callable 是一个 FunctionalInterface(即具有单个抽象方法的接口(interface)),它可以用 lambda 表达式创建,所以你可以这样做

Task<Iterable<Showing>> task = Tasks.create(() -> sDAO.listFiltered());

有一个explanation为什么不允许在 OpenJDK 邮件列表上使用 lambda 来创建(有效地)具有单个抽象方法的抽象类的子类。

关于java - Lambda for JavaFX 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089593/

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