如何从JavaFX8中的TableView的焦点模型中获取类型为<s,t =“”>的TableColumn并仍然进行干净的编译?

时间:2018-10-10 01:24:47

标签: generics javafx tableview javafx-8 compiler-warnings

另一个有关Java新手的问题。

我正在清理代码,现在只剩下最后两个编译器问题。两者都涉及需要从对TableColumn的调用中获取类型<S, T>的{​​{1}}。我收到编译器警告,但仍无法解决。

我认为警告来自tableView.getFocusModel().getFocusedCell()的焦点模型对原始TableView类型的使用,如果我正确理解了含义,则意味着任何基于TablePosition调用TableColumn返回的TablePosition上的必须声明为 raw 类型,以便代码可以干净地编译。

IE。如果我这样做:

tableView.getFocusModel().getFocusedCell()

那么,只有这样做,我才能获得干净的编译结果:

TablePosition pos = tableView.getFocusModel().getFocusedCell();
Java文档中的

TablePosition.java TableColumn col = pos.getTableColumn(); 返回pos.getTableColumn(),如果焦点模型返回原始{{1 }}类型。我知道。

但是,如果我随后不得不将TableColumn<S,T>声明为原始的,如何将其“转换”为类型TablePosition(或解决泛型?),以使我最终TableColumn仍然可以进行干净的编译?知道这一点后,我希望能够解决最后两个编译器问题。

我在How to work around Java generic wildcard limitations中尝试了可接受的答案,尽管可行,但抑制编译器错误不是我想要的。我还尝试使用<S, T>的选择模型而不是焦点模型,但是似乎TableColumn<S, T>也返回原始的TableView。用户Jai在回答我先前问过Why does the compiler generate unchecked warnings when using TableColumn<S, T> rather than TableColumn<S, ?> to select a cell in a JavaFX8 TableView?的问题时,解释了焦点模型对原始table.getSelectionModel().getSelectedCells().get(0)的使用。

如果有帮助,那么这里是我正在使用的MVCE,以尝试解决最后两个编译器问题。两者都涉及需要在TablePositionTablePosition方法中的每个方法中获取类型为TableColumn的{​​{1}}。我留下了我的评论,以便您可以看到我的尝试。另外,为了重现这些问题,MVCE必须使用我的应用程序使用的自定义复选框单元格。我已对其进行了尽可能多的修剪,以使其尽可能保持“ M”。

我正在使用JavaFX8(JDK1.8.0_181),NetBeans 8.2和Scene Builder 8.3。

我正在使用“ -Xlint:unchecked”进行编译。

<S, T>

1 个答案:

答案 0 :(得分:1)

感谢用户Jai的帮助,答案是从对TableColumn<S, T>的调用中获取tableView.getFocusModel().getFocusedCell();并进行干净编译的唯一方法是使用@SuppressWarnings("unchecked")注释。 / p>

这是因为:

  1. 编写TableView API来从TablePosition返回原始的getFocusedCell()类型。
  2. 没有 不能将原始类型“转换”为<S, T>(或任何其他)类型。它们是完全不同的东西。

因此,我的问题在MVCE中突出显示的编译器问题是这样解决的:

@SuppressWarnings("unchecked") 
private static <S, T> TableColumn<S, T> getFocussedColumnx() {
    TablePosition<S, T> pos = (TablePosition<S, T>) table.getFocusModel().getFocusedCell();
    TableColumn<S, T> col = (TableColumn<S, T>) pos.getTableColumn();
    return col;
}

这:

@SuppressWarnings("unchecked")
public <S, T> Node getGraphic() {
    TablePosition<S, T> pos = (TablePosition<S, T>) table.getFocusModel().getFocusedCell();
    TableColumn<S, T> col = (TableColumn<S, T>) pos.getTableColumn();
    TableCell<S, T> cell = (TableCell<S, T>) col.getCellFactory().call(col);
    Node cellGraphic = cell.getGraphic();
    return cellGraphic;
}

感谢Jai向我指出正确的方向。