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

10-09 05:11