另一个有关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,以尝试解决最后两个编译器问题。两者都涉及需要在TablePosition
和TablePosition
方法中的每个方法中获取类型为TableColumn
的{{1}}。我留下了我的评论,以便您可以看到我的尝试。另外,为了重现这些问题,MVCE必须使用我的应用程序使用的自定义复选框单元格。我已对其进行了尽可能多的修剪,以使其尽可能保持“ M”。
我正在使用JavaFX8(JDK1.8.0_181),NetBeans 8.2和Scene Builder 8.3。
我正在使用“ -Xlint:unchecked”进行编译。
<S, T>
答案 0 :(得分:1)
感谢用户Jai的帮助,答案是从对TableColumn<S, T>
的调用中获取tableView.getFocusModel().getFocusedCell();
并进行干净编译的唯一方法是使用@SuppressWarnings("unchecked")
注释。 / p>
这是因为:
TableView
API来从TablePosition
返回原始的getFocusedCell()
类型。<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向我指出正确的方向。