如何解决类型安全警告 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
个文件
嗯,首先,Collection
是 List
的超级接口,所以除非您确定 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(...);
我有以下代码:
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
个文件
嗯,首先,Collection
是 List
的超级接口,所以除非您确定 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(...);