gpt4 book ai didi

java - 通用回调 JavaFX 中没有推理

转载 作者:行者123 更新时间:2023-12-02 02:55:08 25 4
gpt4 key购买 nike

我有一个TextFieldTableCell<Item,String>我需要验证,因此我不能使用通常的方式

column.setCellFactory(TextFieldTableCell.forTableColumn());

所以我的意图是做类似的事情

column.setCellFactory(param -> {
TableCell<Item,String> cell = TextFieldTableCell.forTableColumn().call(params);
validate(validationRules, cell);
});

但是它说的是

CallbackTableColumn<Object,String>,TableCell<Object,String> cannot be 
applied to TableColumn<Item,String>

我明白了,我不明白的是它是否应该推断类型而不是 Object

我发现的唯一解决方法是定义一个新的 StringConverter<String>这看起来有点令人讨厌。

new StringConverter<String>() {
@Override
public String toString(String object) {
return object;
}

@Override
public String fromString(String string) {
return string;
}
}

最佳答案

通过链接两个方法调用(TextFieldTableCell.forTableColumn()call()),您无需指定第一个方法返回的实际类型方法,因此编译器没有机会推断该方法调用应返回的类型。

如果你希望编译器推断这一点,你可以这样做

Callback<TableColumn<Item, String>, TableCell<Item, String>> callback = TextFieldTableCell.forTableColumn();
TableCell<Item, String> cell = callback.call(param);

当然,这比仅仅指定泛型方法的类型forTableColumn要冗长得多。直接:

TableCell<Item, String> cell = TextFieldTableCell.<Item>forTableColumn().call(param);

不过,所有这一切似乎都有点人为。您正在实现回调,并且由于 TextFieldTableCell 有适当的可用构造函数,因此无需执行中间的Callback。你可以这样做:

column.setCellFactory(col -> {
TextFieldTableCell<Item, String> cell = new TextFieldTableCell<>();
validate(validationRules, cell);
return cell ;
});

或者,如果您需要指定转换器:

StringConverter<String> converter =  ... ;
column.setCellFactory(col -> {
TextFieldTableCell<Item, String> cell = new TextFieldTableCell<>(converter);
validate(validationRules, cell);
return cell ;
});

对于默认转换器,您只需使用

TextFieldTableCell<Item, String> cell = 
new TextFieldTableCell<>(TextFormatter.IDENTITY_STRING_CONVERTER);

关于java - 通用回调 JavaFX 中没有推理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43215045/

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