在向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 ); // <---- 警告:为varargs参数创建未选中的泛型array.
Scene scene = new Scene ( tableViewPersons , 320 , 240 );
stage.setTitle ( "JavaFX Example" );
stage.setScene ( scene );
stage.show ( );
}
…
台词是:
tableViewPersons.getColumns ( ).setAll ( firstNameCol , lastNameCol );
…为以下各项生成警告:
警告:为varargs参数创建未选中的泛型数组
我从this Answer对Java unchecked: unchecked generic array creation for varargs parameter和this post了解到,这个问题涉及到传递的参数类型的模棱两可.
如果我的目标是解决这个编译器警告,那么一个解决方案是显式地将TableColumn
个对象的集合的参数化类型传递给ObservableList#setAll
.所以我们可以显式声明TableColumn
个对象中的List
个.
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 ( );
}
…
我的问题是:
- 这是解决"未判断的泛型"警告的有效、完整的解决方案吗?
- 有没有其他更简单的方法来解决"未判断的泛型"警告?(我不想取消这个警告.)