gpt4 book ai didi

java - 让 BiConsumer 接受对象

转载 作者:搜寻专家 更新时间:2023-10-30 19:59:12 25 4
gpt4 key购买 nike

我有一个 JTable TableModel 的列定义列表,列“B”有一个接受 BauwerkOption 类和字符串的 setter BiConsumer。

当我尝试在带有“...接受...”的行中设置字符串时,出现以下错误:

The method accept(Selektierung.BauwerkOption, capture#4-of ? extends Object) in the type BiConsumer<Selektierung.BauwerkOption,capture#4-of ? extends Object> is not applicable for the arguments (Selektierung.BauwerkOption, Object)

我的代码有什么问题?我想做的事情甚至有可能吗?

public class TableModelSelektierung extends DefaultTableModel {
private static final long serialVersionUID = -5921626198599251183L;
private List<BauwerkOption> data;
private static List<ColDef<BauwerkOption, ? extends Object>> DEF = new ArrayList<>();
static {
DEF.add(new ColDef<BauwerkOption, String>("A", (o) -> o.getBauwerkstyp()));
DEF.add(new ColDef<BauwerkOption, String>("B", (o) -> o.getBezeichnung())
.withSetValueAtFunction((i, o) -> i.setBauwerkstyp(o)));
DEF.add(new ColDef<BauwerkOption, String>("C", (o) -> o.getNutzungsart()));
DEF.add(new ColDef<BauwerkOption, Double>("D", (o) -> o.getDurchmesser()));
}

@Override
public int getColumnCount() {
return DEF.size();
}

@Override
public boolean isCellEditable(int row, int column) {
return DEF.get(row).getValueSetterFunction() == null;
}

@Override
public int getRowCount() {
if (data != null) {
return data.size();
}
return 0;
}

@Override
public String getColumnName(int column) {
return DEF.get(column).getTitle();
}

public void setData(List<BauwerkOption> data) {
this.data = data;
fireTableDataChanged();
}

public BauwerkOption getObjectAt(int row) {
return data.get(row);
}

@Override
public void setValueAt(Object aValue, int row, int column) {
if (DEF.get(column).getValueSetterFunction() != null) {
DEF.get(column).getValueSetterFunction().accept(getObjectAt(row), aValue);
}
}

@Override
public Object getValueAt(int row, int column) {
BauwerkOption o = getObjectAt(row);
return DEF.get(column).getValueGetterFunction().apply(o);
}

}


class ColDef<InputObjekt, OutputValue> {
private String title;
private Function<InputObjekt, OutputValue> valueGetterFunction;
private BiConsumer<InputObjekt, OutputValue> valueSetterFunction;

public ColDef(String title, Function<InputObjekt, OutputValue> valueGetterFunction) {
this.title = title;
this.valueGetterFunction = valueGetterFunction;
}

public ColDef<InputObjekt, OutputValue> withSetValueAtFunction(BiConsumer<InputObjekt, OutputValue> valueSetterFunction) {
this.valueSetterFunction = valueSetterFunction;
return this;
}

public Function<InputObjekt, OutputValue> getValueGetterFunction() {
return valueGetterFunction;
}

public String getTitle() {
return title;
}

public BiConsumer<InputObjekt, OutputValue> getValueSetterFunction() {
return valueSetterFunction;
}

}

class BauwerkOption {


public BauwerkOption() {

}

public String getBezeichnung() {
return "";
}

public String getBauwerkstyp() {
return "";
}

public Double getDurchmesser() {

return 0d;
}

public String getNutzungsart() {
return "todo";
}



public void setBauwerkstyp(String s) {

}
}

最佳答案

没有干净的方法可以做到这一点,因为 setValueAt 中的 Object 参数类型无法更改。

如果您替换以下代码,它将尽可能干净:

这只是为了方便(您不需要自己的 lambda):

private static List<ColDef<BauwerkOption, ?>> DEF = new ArrayList<>();
static {
DEF.add(new ColDef<BauwerkOption, String>("A", BauwerkOption::getBauwerkstyp));
DEF.add(new ColDef<BauwerkOption, String>("B", BauwerkOption::getBezeichnung).withSetValueAtFunction(BauwerkOption::setBauwerkstyp));
DEF.add(new ColDef<BauwerkOption, String>("C", BauwerkOption::getNutzungsart));
DEF.add(new ColDef<BauwerkOption, Double>("D", BauwerkOption::getDurchmesser));
}

在 ColDef 中只需添加此方法而不更改任何其他内容:

@SuppressWarnings("unchecked")
public BiConsumer<InputObjekt, Object> getObjectValueSetterFunction() {
return (BiConsumer<InputObjekt, Object>) valueSetterFunction;
}

然后将 TableModelSelektierung 中的 setValueAt 替换为:

@Override
public void setValueAt(Object aValue, int row, int column) {
if (DEF.get(column).getValueSetterFunction() != null) {
DEF.get(column).getObjectValueSetterFunction().accept(getObjectAt(row), aValue);
}
}

保留您的泛型,但解决您从继承中获得的对象限制。您可能应该在 setValueAt 中添加类型检查以确保对象参数的类型正确。

关于java - 让 BiConsumer 接受对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49767910/

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