gpt4 book ai didi

Java lambda 参数类型未正确推断

转载 作者:行者123 更新时间:2023-12-01 19:49:58 25 4
gpt4 key购买 nike

我正在尝试在 javafx 上调用此方法:TableColumn.setOnEditCommit 。该方法的定义如下:

public final void setOnEditCommit(EventHandler<CellEditEvent<S,T>> value) {
// ...
}

如您所见,它明确需要 EventHandler类型 CellEditEvent (扩展 Event )。 EventHandler的定义:

public interface EventHandler<T extends Event> extends EventListener {
void handle(T event);
}

很明显,调用 setOnEditCommit (没有兰巴),人们会输入以下内容:

column.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent>() {
public void handle(CellEditEvent event) {
event.getTableView().doSomething();
}
});

注意:getTableViewCellEditEvent 的方法,但不是Event .

到目前为止一切都很好。我遇到的问题是,如果不进行强制转换,使用 lambda 编写上述代码似乎是不可能的。也就是说,上面的 lba 等效项是:

column.setOnEditCommit(event -> event.getTableView().doSomething());

问题就在这里。 Lambda不关心该事件应该是 CellEditEvent因为setOnEditCommit方法明确指出 EventHandler的 vararg 是 CellEditEvent .

显然,在推断参数类型时,lambda 会检查 EventHandler类定义,特别是 <T extends Event>部分,然后确定 T 是 Event ,就是这样,而不是 t 扩展 Event 。在这种情况下,抛出的错误是找不到方法“getTableView” - 因为 Event类没有该方法。

不仅如此,甚至没有明确说明参数类型也是行不通的:

column.setOnEditCommit((TableColumn.CellEditEvent event) -> event.getTableView().doSomething());

错误结果:

Error:(10, 32) java: incompatible types: incompatible parameter types in lambda expression

我的问题是:为什么 lambda 不能正确推断参数应该是 T extends Event (本例中为 CellEditEvent ),而不是 Event ,有什么办法可以解决这个问题吗?

完整示例:

import javafx.scene.control.TableColumn;
public class Main {
public static void main(String[] args) {
TableColumn column = null;
column.setOnEditCommit(event -> event.getTableView());
}
}

最佳答案

编译器没有该类型信息。编译器拥有的唯一信息是:

public interface EventHandler<T extends Event> extends EventListener {
void handle(T event);
}

现在你想像这样使用它:

import javafx.scene.control.TableColumn;
public class Main {
public static void main(String[] args) {
TableColumn column = null;
column.setOnEditCommit(event -> event.getTableView());
}
}

编译器如何确定事件的类型? CellEditEvent 类型没有出现在任何地方。

在这种情况下,您必须明确指定所需的类型。

column.setOnEditCommit((TableColumn.CellEditEvent event) -> event.getTableView().doSomething());

关于Java lambda 参数类型未正确推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51771227/

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