我正在尝试将CellFactory
从一个TableColumn
复制到另一个。我遇到的问题是泛型。
问题是table.getColumns()
返回一个TableColumn<X, ?>
列表,我想创建一个新列,并使用相同的Tablecolumn<X, ?>
参数,但是我无法知道第二个?
参数。
for (TableColumn<X, ?> col : table.getColumns()) {
TableColumn<X, ?> newCol = new TableColumn<>();
newCol.setCellValueFactory(col.getCellValueFactory()); // Error <X, ?> != <X, ?>
}
我是否可以定义将在两种情况下使用的通用类型?还是由于通用信息在运行时丢失而无法实现?
编辑:
将其强制转换为
TableColumn<X, Object>
似乎可行,但这感觉非常错误,我宁愿不依赖于强制转换为Object
。for (TableColumn<X, ?> col : table.getColumns()) {
TableColumn<X, Object> tempCol = (TableColumn<X, Object>) col;
TableColumn<X, Object> newCol = new TableColumn<>();
newCol.setCellValueFactory(tempCol.getCellValueFactory());
}
最佳答案
在Java中,通配符代表未知类型。这意味着两个未知类型不能为同一类型。为了告诉编译器我们正在处理相同的未知类型,我们需要定义一个临时的通用类型Y
,它将两个TableColumns绑定到相同的类型。我们这样做的唯一方法是将新TableColumn的创建和更新移动到一个单独的参数化方法中,如下所示:
for ( TableColumn<X, ?> col : getColumns() ) {
TableColumn<X, ?> newCol = create(col);
}
public <Y> TableColumn<X, ?> create(TableColumn<X, Y> tc){
TableColumn<X, Y> newCol = new TableColumn<>();
newCol.setCellValueFactory( tc.getCellValueFactory() );
return newCol;
}
关于java - 在2个对象中使用相同的通用通配符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47699883/