在向 JavaFX 应用程序中的表视图控件添加列的常见情况下,我遇到了编译器警告。
为了演示,这里是我在 JavaFX/OpenJFX 类
TableView
的 Javadoc 中看到的代码示例的修改版本。请注意 getColumns
线。
public class HelloApplication extends Application
{
@Override
public void start ( Stage stage )
{
TableView < Person > tableViewPersons = new TableView <> ( );
ObservableList < Person > persons = FXCollections.observableArrayList ( this.fetchPersons ( ) );
tableViewPersons.setItems ( persons );
TableColumn < Person, String > firstNameCol = new TableColumn <> ( "First Name" );
firstNameCol.setCellValueFactory ( new PropertyValueFactory <> ( persons.get ( 0 ).firstNameProperty ( ).getName ( ) ) );
TableColumn < Person, String > lastNameCol = new TableColumn <> ( "Last Name" );
lastNameCol.setCellValueFactory ( new PropertyValueFactory <> ( persons.get ( 0 ).lastNameProperty ( ).getName ( ) ) );
tableViewPersons.getColumns ( ).setAll ( firstNameCol , lastNameCol ); // <---- Warning: Unchecked generics array creation for varargs parameter.
Scene scene = new Scene ( tableViewPersons , 320 , 240 );
stage.setTitle ( "JavaFX Example" );
stage.setScene ( scene );
stage.show ( );
}
…
线路:
tableViewPersons.getColumns ( ).setAll ( firstNameCol , lastNameCol );
…生成警告:
警告:未检查可变参数参数的泛型数组创建
我从Java unchecked: unchecked generic array Creation for varargsparameter的this Answer中了解到,该问题涉及传递参数类型的歧义。 如果我的目标是解决此编译器警告,那么一种解决方案是明确将
TableColumn
对象集合的参数化类型传递给
ObservableList#setAll
。因此我们可以显式声明 List
对象的 TableColumn
。 List < TableColumn < Person, ? > > columns = List.of ( firstNameCol , lastNameCol ); // <--- Adding this line to make explicit the parameterized type of `TableColumn` to resolve the "Unchecked generics" warning.
tableViewPersons.getColumns ( ).setAll ( columns );
在完整的上下文中查看新代码:
public class HelloApplication extends Application
{
@Override
public void start ( Stage stage )
{
TableView < Person > tableViewPersons = new TableView <> ( );
ObservableList < Person > persons = FXCollections.observableArrayList ( this.fetchPersons ( ) );
tableViewPersons.setItems ( persons );
TableColumn < Person, String > firstNameCol = new TableColumn <> ( "First Name" );
firstNameCol.setCellValueFactory ( new PropertyValueFactory <> ( persons.get ( 0 ).firstNameProperty ( ).getName ( ) ) );
TableColumn < Person, String > lastNameCol = new TableColumn <> ( "Last Name" );
lastNameCol.setCellValueFactory ( new PropertyValueFactory <> ( persons.get ( 0 ).lastNameProperty ( ).getName ( ) ) );
List < TableColumn < Person, ? > > columns = List.of ( firstNameCol , lastNameCol ); // <--- Adding this line to make explicit the parameterized type of `TableColumn` to resolve the "Unchecked generics" warning.
tableViewPersons.getColumns ( ).setAll ( columns );
Scene scene = new Scene ( tableViewPersons , 320 , 240 );
stage.setTitle ( "JavaFX Example" );
stage.setScene ( scene );
stage.show ( );
}
…
我的问题:
这是解决“未检查的泛型”警告的有效、完整的解决方案吗?
例如,您可以在列表上调用clear,然后为每个项目单独调用add方法,而不是执行setAll,而不是使用可变参数类型的setAll便捷方法。
它比较冗长,但会避免任何潜在的类型错误和警告。 (我并不是提倡这种方法,只是让你知道可能性)。
您可以替换通话:
tableViewPersons.getColumns().setAll(firstNameCol, lastNameCol); // <---- Warning: Unchecked generics array creation for varargs parameter.
使用不使用可变参数参数的备用 API 调用:
tableViewPersons.getColumns().clear();
tableViewPersons.getColumns().add(firstNameCol);
tableViewPersons.getColumns().add(lastNameCol);
我的观点是,在很多情况下,未经检查的东西只是一种烦恼。我认为在 TableView 定义、支持列表等中包含主要类型是很好的。但是,当您在使用已经键入的类和方法时开始不得不执行诸如使用通配符类型或方法级别类型说明符之类的操作时,它会变得更分散注意力而不是有益。在这种情况下,我建议有选择地
抑制警告在 Idea 中抑制。在这样做之前,请检查它是否真的是一个重大的潜在错误,但如果不是(就像许多未经检查的泛型警告 IMO),那么我认为抑制它们是可以的。