在2个对象中使用相同的通用通配符

时间:2017-12-07 16:48:14

标签: java generics javafx

我正在尝试将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>

1 个答案:

答案 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;
}