Java 类型安全:类型列表的表达式需要未经检查的转换才能符合集合<;?扩展对象>;

Java 类型安全:类型列表的表达式需要未经检查的转换才能符合集合<;?扩展对象>;,java,collections,warnings,unchecked-conversion,Java,Collections,Warnings,Unchecked Conversion,我正在使用set为某些操作定义允许的键。Eclipse显示以下警告: Type safety: The expression of type List needs unchecked conversion to conform to Collection<? extends Object> 这是个好主意 @SuppressWarnings("unchecked") 在这种情况下 这是我的密码: public static final String KEY_A = "A_

我正在使用set为某些操作定义允许的键。Eclipse显示以下警告:

 Type safety: The expression of type List needs unchecked conversion
 to conform to Collection<? extends Object>
这是个好主意

@SuppressWarnings("unchecked") 
在这种情况下

这是我的密码:

  public static final String KEY_A = "A_VALUE";
  public static final String KEY_B = "B_VALUE";

  public static final Set<?> allowedKeys =  new HashSet<Object>(Arrays.asList(new String[] {KEY_A, KEY_B}));
公共静态最终字符串键\u A=“A\u值”;
公共静态最终字符串键_B=“B_值”;
public static final Set allowedKeys=new HashSet(Arrays.asList(新字符串[]{KEY_A,KEY_B}));
只有在您必须使其与现有代码一起工作时,才应使用
集合
集合
。否则,尝试创建特定类型


如果您确定集合只包含
String
元素,
set
是最佳选择。

Eclipse解决了这个问题:
错:

正确:

import jave.util.Arrays;


因此,代码在
Set
Set
两个版本中都是正常的。Eclipse只是自动导入了坏类。

尝试使用源代码理解问题,并消除类型未检查的转换警告

private static Vector<Vector<String>> tableVectorData;
private static Vector<String> rowData = new Vector<String>();
用于检索元素-

rowData.clear();
rowData.addElement((strings[0])[0][0]);
rowData.addElement((strings[0])[1][0]);
tableVectorData.addElement(rowData);
model = (DefaultTableModel) table.getModel();
rowCount = tableVectorData.size();
int i = 0;
while(i < rowCount) {
    Vector<String> row = tableVectorData.get(i++);//here the type check warning will occur
    model.setRowCount(model.getRowCount()+1);
    System.out.println(row);
    model.setValueAt(row.get(0), model.getRowCount()-1, 0);
    model.setValueAt(row.get(1), model.getRowCount()-1, 1);
}
model=(DefaultTableModel)table.getModel();
rowCount=tableVectorData.size();
int i=0;
而(i
或者使用
迭代器
-

Iterator rows=tableVectorData.Iterator()//此时将出现类型检查警告
布尔标志=假;
校验值:
while(rows.hasNext()){
Vector vect=rows.next();
if(向量包含(值)){
flag=true;
中断校验值;
}
}

希望这些将为您提供一种处理这些表达式类型检查警告的方法,谢谢。

为什么不使用
Set
HashSet
?@Eran我认为它是哪种类型并不重要。我只调用它allowedkey.contains(key)。或者两者之间有什么有用的区别?顺便问一下,如果你按照你的要求写,警告信息的情况仍然是一样的。你的错误与哪个表达式有关?您还没有显示从原始类型
列表
转换为
集合
@MarkoTopolnik的任何地方,所有相关代码都在讨论中提到。我前面的注释allowedKeys.contains(key)中只提到了其他操作,它用于检查键是否在集合中。但我已经找到了原因。eclipce中的自动导入造成了混乱。它使用import edu.emory.mathcs.backport.java.util.Arrays代替java.util.Arrays;这只是IDE试图帮助您时发生的WTF情况之一。+1对于集合和集合的解释,我正在使其与现有代码一起工作,但我非常确定它将始终是字符串,因此我将转到集合
rowData.clear();
rowData.addElement((strings[0])[0][0]);
rowData.addElement((strings[0])[1][0]);
tableVectorData.addElement(rowData);
model = (DefaultTableModel) table.getModel();
rowCount = tableVectorData.size();
int i = 0;
while(i < rowCount) {
    Vector<String> row = tableVectorData.get(i++);//here the type check warning will occur
    model.setRowCount(model.getRowCount()+1);
    System.out.println(row);
    model.setValueAt(row.get(0), model.getRowCount()-1, 0);
    model.setValueAt(row.get(1), model.getRowCount()-1, 1);
}
Iterator<Vector<String>> rows = tableVectorData.iterator();//here the type check warning will occur
boolean flag = false;

checkValue:
while(rows.hasNext()) {
    Vector<String> vect = rows.next();
    if(vect.contains(value)) {
        flag = true;
        break checkValue;
    }
}