Generics 如何获取类型为<;的TableColumn;S、 T>;从表视图';它在JavaFX8中关注模型,并且仍然得到一个干净的编译?

Generics 如何获取类型为<;的TableColumn;S、 T>;从表视图';它在JavaFX8中关注模型,并且仍然得到一个干净的编译?,generics,javafx,tableview,javafx-8,compiler-warnings,Generics,Javafx,Tableview,Javafx 8,Compiler Warnings,另一个相对的Java新手问题 我正在清理我的代码,并着手解决最后两个编译器问题。两者都涉及到需要从调用tableView.getFocusModel().getFocusedCell()获取类型为的TableColumn。我收到编译器警告,但尚未解决 我认为警告源于TableView的焦点模型使用了原始TablePosition类型,如果我正确理解了其含义,这意味着基于调用TableView.getFocusModel().getFocusedCell()返回的TablePosition的任何T

另一个相对的Java新手问题

我正在清理我的代码,并着手解决最后两个编译器问题。两者都涉及到需要从调用
tableView.getFocusModel().getFocusedCell()
获取类型为
TableColumn
。我收到编译器警告,但尚未解决

我认为警告源于
TableView
的焦点模型使用了原始
TablePosition
类型,如果我正确理解了其含义,这意味着基于调用
TableView.getFocusModel().getFocusedCell()返回的
TablePosition
的任何
TableColumn
必须声明为原始类型,才能干净地编译代码

即,如果我这样做:

TablePosition pos = tableView.getFocusModel().getFocusedCell();
TableColumn col = pos.getTableColumn();
如果我这样做,我将永远不会得到一个干净的编译:

TablePosition pos = tableView.getFocusModel().getFocusedCell();
TableColumn col = pos.getTableColumn();
java文档中的TablePosition.java说
pos.getTableColumn()
返回
TableColumn
,我想如果焦点模型返回原始
TablePosition
类型,它就不能这样做。我明白

但是,如果我必须声明一个
TableColumn
为原始,我如何才能将它“转换”为类型
(或者处理泛型?),这样我最终得到
TableColumn
,并且仍然得到一个干净的编译?一旦我知道了这一点,我将有望修复最后两个编译器问题

我在中使用了公认的答案进行了试验,虽然这样做有效,但抑制编译器错误并不是我想要做的。我还尝试使用
TableView
的选择模型,而不是焦点模型,但似乎
table.getSelectionModel().getSelectedCells().get(0)
也会返回原始的
TablePosition
。焦点模型使用原始
TablePosition
,用户Jai在回答我之前提出的问题时对此进行了解释

如果有帮助的话,下面是我用来解决最后两个编译器问题的MVCE。两者都涉及到需要在每个
GetFocusedColumn()
getGraphic()
方法中获取类型为
TableColumn
。我留下了我的评论,所以你可以看到我尝试了什么。此外,为了重现问题,MVCE必须使用我的应用程序使用的自定义复选框单元格。我尽可能地修剪它,使它尽可能保持“M”

我正在使用JavaFX8(JDK1.8.0µ)、NetBeans 8.2和Scene Builder 8.3

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

包测试28;
导入java.util.function.BiConsumer;
导入java.util.function.function;
导入javafx.application.application;
导入静态javafx.application.application.launch;
导入javafx.application.Platform;
导入javafx.beans.property.BooleanProperty;
导入javafx.beans.property.SimpleBoleAnProperty;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.geometry.Insets;
导入javafx.scene.Node;
导入javafx.scene.Parent;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.CheckBox;
导入javafx.scene.control.ContentDisplay;
导入javafx.scene.control.TableCell;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TablePosition;
导入javafx.scene.control.TableView;
导入javafx.scene.control.ToggleGroup;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.layout.HBox;
导入javafx.stage.stage;
公共类Test28扩展了应用程序{
静态TableView table=新TableView();
ToggleGroup tgRadios=新的ToggleGroup();
私有父createContent(){
ObservableList olTestModel=FXCollections.observableArrayList();
添加(新的TestModel(false));
添加(新的TestModel(true));
添加(新的TestModel(false));
表2.setItems(olTestModel);
Platform.runLater(()->table.getSelectionModel().selectFirst());
//列,该列具有作为复选框呈现的自定义单元格
TableColColCheckbox=createCheckBoxColumn(“复选框”,TestModel::checkboxProperty,TestModel::setCheckbox);
table.getSelectionModel().setCellSelectionEnabled(true);
table.setEditable(true);
table.getColumns().add(colCheckbox);
按钮btnGetFocussedCol=新按钮(“聚焦列”);
BTNGETFocusedCol.setOnAction(事件->{
TableColumn col=GetFocusedColumn();
System.out.println(“col=“+col”);
});
按钮btnGetGraphic=新按钮(“获取图形”);
btnGetGraphic.setOnAction(事件->{
Node=getGraphic();
System.out.println(“node=“+node”);
});
边框窗格内容=新边框窗格(表);
HBox hb=新的HBox();
hb.设置填充(新插图(10,10,10,10));
hb.setspace(20.0);
hb.getChildren().addAll(btngetfocusedcol,btnGetGraphic);
setTop(hb);
返回内容;
}
//*************************************************************************************
//要解决的其余两个编译器问题中的第一个问题
私有静态表列GetFocusedColumn(){
//getFocusedCell()返回原始表位置
TablePosition pos=table.getFocusModel().getFocusedCell();
//pos.getTableColumn()应该返回TableColumn,但是,pos是原始类型
//所以我想这就是为什么我在下面的行中得到一个未检查的转换警告
//TableColumn=pos.getTableColumn();
//强制转换将生成未选中的强制转换警告
//TableColumn列=(TableColumn)位置getTableColumn();
//使用原始TableColumn类型修复TableColumn声明中的警告
//但在“返回列”行上生成未选中的转换警告
表列
@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;
}