我正在尝试将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());
}
。
<td>
答案 0 :(得分:1)
在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;
}