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));