如何解决类型安全警告 Unchecked cast from Collection to List<File> Java 6 without suppress annotation

How to address Type safety warning Unchecked cast from Collection to List<File> Java 6 without suppress annotation

我有以下代码:

public void someMethod(String directory,final String extension) {

    List<File> fileList = (List<File>) FileUtils.listFiles(new File(directory), new String[] {extension} , true); 
    File[] files = new File[fileList.size()];
    // ...

    for(File f : files) {
       // looping...
    }
}

我的代码中出现黄色波浪线并发出警告:

Type safety: Unchecked cast from Collection to List

我该如何解决这个问题?

编辑 1:

请不要压制注释,我想了解发生了什么。我试过这样做:

if(fileList instanceof List<?>) {
    // data processing here...
}

这并没有使警告消失...这真的很困扰我...

编辑 2:

我决定这样做:

List<?> fileList = (List<?>) FileUtils.listFiles(new File(directory), new String[] {extension} , true);

File[] files = new File[fileList.size()];

int i=0;
if(fileList instanceof List<?>) {
    for (Object obj : fileList) {
        try {
            File file = (File)obj;
            files[i] = new File(file.getCanonicalPath());
        } catch (IOException e) {
            e.printStackTrace();
        }
        i++;
    }
}

为什么需要 List<File>?为什么不这样做:Collection<File> files=FileUtils.listFiles(...)?这不会给您警告,您仍然可以遍历 Collection 个文件

嗯,首先,CollectionList 的超级接口,所以除非您确定 listFiles() 的实现将 总是 return一个List,你不应该沮丧(以避免ClassCastException)。在大多数情况下,如果你需要一个列表而不是一个集合,那么简单地从 returned 集合创建一个新列表会更明智,例如,

Collection<File> myCollection = FileUtils.listFiles(...);
List<File> myList = new ArrayList<File>(myCollection);

或者,如果您只想将集合转换为数组,则根本不需要创建任何列表。您所要做的就是:

Collection<File> myCollection = FileUtils.listFiles(...);
File[] myArray = myCollection.toArray(new File[myCollection.size()]);

如果编译器继续给你警告,那么你唯一剩下的问题就是 listFiles() 方法本身;它是 returning raw type Collection instead of the generic type Collection<File>. To remove the associated warning, either update to the latest version of Commons IO,或者只是适当地插入 @SuppressWarnings("unchecked") 注释,例如,

@SuppressWarnings("unchecked")
Collection<File> myCollection = FileUtils.listFiles(...);