如何解决Java通用通配符限制

时间:2016-02-14 13:00:50

标签: java generics javafx

我在尝试迭代JavaFX TableView的列时遇到了这个问题。我想调用每个列的cellFactory,所以我做了类似的事情 -

for (TableColumn<Model, ?> column : getTableView().getColumns()) {
    column.getCellFactory().call(column);
}

不幸的是,这不起作用,因为我收到了编译错误:

  

不兼容的类型:javafx.scene.control.TableColumn&lt;模型,捕获#1? &GT;无法转换为javafx.scene.control.TableColumn&lt;模型,捕获#2? &GT;

我怎样才能克服这一点?我可以投射参数吗?介绍显式类型参数?

这些列自然不是完全相同的类型,我非常希望避免对每列的类型进行硬编码,因为此代码应该用于各种TableView s。

3 个答案:

答案 0 :(得分:3)

如果您不想创建新类,可以使用通用静态方法

public static<T> void callCellFactory(TableColumn<Model,T> column){
    column.getCellFactory().call(column);
}

然后将使用相同的类型T对列和cellFactory()进行参数化。

您将能够将该函数用于具有通配符的对象:

    for (TableColumn<Model, ?> column : tableView.getColumns()) {
        callCellFactory(column);
    }

答案 1 :(得分:2)

您可以删除generics参数并禁止rawtypes警告

for (@SuppressWarnings("rawtypes") TableColumn column : getTableView().getColumns()) {
    column.getCellFactory().call(column); // now compiles
}

答案 2 :(得分:1)

如果您能够扩展holder.txt_msg_user.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (holder.txt_date_user.isShown() && holder.txt_AM_user.isShown()) { holder.usertimelayout.setVisibility(View.GONE); holder.txt_date_user.setVisibility(View.GONE); holder.txt_AM_user.setVisibility(View.GONE); } else { holder.usertimelayout.setVisibility(View.VISIBLE); holder.txt_date_user.setVisibility(View.VISIBLE); holder.txt_AM_user.setVisibility(View.VISIBLE); } } }); 类,则可以添加如下所示的方法:

TableColumn

这使您可以在不需要知道第二个通用的确切类别的情况下进行调用。您需要为每个列执行的操作是调用非泛型方法public void callCellFactory() { this.getCellFactory().call(this); } ,并且类的内部泛型将为您处理调用。

请注意,您还需要使用新类而不是callCellFactory()的可迭代来获取迭代。