Java 未检查泛型的问题

Java 未检查泛型的问题,java,generics,javafx,Java,Generics,Javafx,我有一个方法在编译时抛出以下警告: warning: [unchecked] unchecked generic array creation for varargs parameter of type TableColumn<ObservableList,?>[] tableview.getColumns().addAll(Col); 警告:[未选中]为的varargs参数创建未选中的通用数组 键入TableColumn[]tableview.getColumns(

我有一个方法在编译时抛出以下警告:

warning: [unchecked] unchecked generic array creation for varargs parameter of     
type TableColumn<ObservableList,?>[]   tableview.getColumns().addAll(Col);
警告:[未选中]为的varargs参数创建未选中的通用数组
键入TableColumn[]tableview.getColumns().addAll(Col);
我知道如果该方法是安全的,我可以添加@SafeVarargs注释来抑制警告。然而,我不确定我的方法是否安全。另外,当我添加注释时(只是为了看看会发生什么),编译器给了我以下错误:

Invalid SafeVarargs annotation. Method InsertSQL(TableView<ObservableList>) 
is not a varargs method.
public TableView InsertSQL(TableView<ObservableList> tableview) 
无效的SafeVarargs批注。方法InsertSQL(TableView)
不是varargs方法。
公共TableView插入SQL(TableView TableView)
以下是所述方法的全部内容:

private TableColumn<ObservableList, String> Col; //declared outside the   
method at the beginning of the class.

@SafeVarargs
public TableView InsertSQL(TableView<ObservableList> tableview) {
    try {
        conn = DriverManager.getConnection(ConnCheck, user, password);
        SysList = FXCollections.observableArrayList();
        st = conn.prepareStatement(SysTableCall);
        SysData = st.executeQuery();

        for (int i = 0; i < SysData.getMetaData().getColumnCount(); i++) {
            final int j = i;
            Col = new TableColumn<>(SysData.getMetaData().getColumnName(i + 1));
            Col.setCellValueFactory(new CallbackImpl(j));
            //Col.setEditable(true);
            if (i == 0) {
                Col.setPrefWidth(344);
                Col.setText("Record Number");
            }
            if (i == 1) {
                Col.setPrefWidth(344);
                Col.setText("Description");
            }
            tableview.getColumns().addAll(Col); //warning found on this line
        }

        while (SysData.next()) {
            ObservableList<String> row = FXCollections.observableArrayList();
            for (int x = 1; x <= SysData.getMetaData().getColumnCount(); x++) {
                row.add(SysData.getString(x));
            }
            SysList.add(row);
        }
        tableview.setItems(SysList);
        st.execute();
        conn.close();
    } catch (SQLException ex) {
        try {
            PreparedStatement st1 = conn.prepareStatement(SysTableCheck);
            st.setString(1, RecCode);
            ResultSet tempData = st1.executeQuery();
            System.out.println(tempData.toString());
            //Logger.getLogger(SysInfo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex1) {
            Logger.getLogger(SysInfo.class.getName()).log(Level.SEVERE, null, ex1);
        }
    }
    return tableview;
}
私有表列Col//对外宣布
方法在类的开头。
@安全变量
公共TableView插入SQL(TableView TableView){
试一试{
conn=DriverManager.getConnection(ConnCheck、用户、密码);
SysList=FXCollections.observearraylist();
st=连接准备声明(系统调用);
SysData=st.executeQuery();
对于(int i=0;i对于(int x=1;x调用带有泛型实例的varargs方法会由于数组和泛型的问题而导致这些警告。在您的情况下,只需使用
add
方法,而不是带有一个参数的
addAll

该问题来自多个不同级别

您正在调用的
addAll(…)
方法是在
ObservableList
中声明的方法:

界面可观察列表

public boolean addAll(E…元素)

()

如果
E
是泛型类型,则会出现问题,例如在您的案例中,
E
是这些对象的数组的
TableColumn,String>
,并且(本质上是因为数组是协变的,即
String[]
对象[]
的子类),该方法的实现可以执行善意的代码,这些代码悄悄地违反了泛型类型的类型安全性。显示了一个示例

还有一个:

public class A<T> {

    public void doBadThings(T... things) {
        if (things.length > 0) {
            Object[] array = things ; // not a problem, whatever T is all Ts are Objects
            array[0] = "oops" ; // this is fine, assigning a String to an Object
        }
    }

    public static void main(String[] args) {
        A<Integer> a = new A<>();
        Integer answer = 42 ;
        a.doBadThings(answer);
    }
}

数组和泛型不能混合使用。你必须使用数组吗?你认为
@SafeVarargs
有什么作用?仅仅从名称varargs和错误消息中不是varargs方法。从
公共TableView InsertSQL(TableView TableView)中删除
@SafeVarargs
阅读后。注释仅用于演示错误。但是,是的,谢谢。我想感谢您提供了非常详细的答案,虽然其他答案足以解决问题,但我希望能够深入了解原因。
TableColumn<ObservableList<?>, String> col1 = ... ;
TableColumn<ObservableList<?>, String> col2 = ... ;
table.getColumns().addAll(Arrays.asList(col1, col2));