我使用Comparator按大小比较文件,但是当我尝试编译代码时,我收到警告:“java使用未经检查或不安全的操作”。我把我的代码放到注释中,而不是程序工作,所以我认为是在Comparator类中进行排序的问题。这是我的代码:
public class size implements Comparator {
@Override
public int compare(Object o1, Object o2) {
long s1 = ((Class)o1).getSize();
long s2 = ((Class)o2).getSize();
if (s1 > s2){
return 1;
}
else if (s1 < s2){
return -1;
}
else {
return 0;
}
}
}
答案 0 :(得分:3)
这两行包含不安全的强制转换:
long s1 = ((Class)o1).getSize();
long s2 = ((Class)o2).getSize();
不安全的强制转换是这个表达式:(Class)o1
,你将o1作为一个对象转换为一个类,而不事先检查o1
是Class
的实例
如果为方法提供Class实例,则程序运行良好。问题是你不能确保没有人用一个不是Class的对象调用yur方法。
如果你的java版本比1.4更新,你应该实现一个类型安全的比较器。
public class size implements Comparator<Class> {
@Override
public int compare(Class o1, Class o2) {
// compare the two class objects
答案 1 :(得分:2)
将您的Comparator
声明为Comparator<File>
,并将比较方法替换为
compare(File o1, File o2)
编辑:或Comparator<Class>
如果您要比较课程。这就是你似乎要做的事情
答案 2 :(得分:2)
我认为代码中存在错误。 你应该这样做:
public static void main(String[] args) {
File parentFile = new File("path to your parent file");
File[] files = parentFile.listFiles();
Arrays.sort(files, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
return new Long(o1.length()).compareTo(o2.length());
}
});
答案 3 :(得分:0)
您应该使用o1.getClass()而不是强制转换
答案 4 :(得分:0)
首先,您使用Comparator作为原始类型。这是错误的,为它添加一个类型参数,然后实现compare(File, File)
。
其次,比较器的性能会很差,因为length
会导致本机系统调用以找出文件的大小。
要解决性能问题,您需要为文件编写包装类。它可以直接实现Comparable
:
public class FileBySize implements Comparable<FileBySize> {
private final File f;
private final Long size;
public FileBySize(File f) { this.f = f; this.size = f.length(); }
@Override public int compareTo(FileBySize other) {
return this.size.compareTo(other.size);
}
}
答案 5 :(得分:0)
这是对的。 Comparator
是一个参数化接口,即用泛型定义的类。
这是你应该实现比较器以避免警告和ClassCasetException
被抛出的可能性的方式:
public class SizeComparator implements Comparator<Object> {
......
}
你的比较器有点特别。它适用于任何对象。这是我在这里写Comparator<Object>
的原因。在大多数情况下,您可以更具体地定义类参数,并在compare()
方法中使用相同的类,例如
public class SizeComparator implements Comparator<String> {
public int compare(String s1, String s2) {
.......
}
}
在您的情况下,您也可以将比较器定义如下:
public class SizeComparator implements Comparator<T extends Object> {
public int compare(T o1, T o2) {
.......
}
}
注意我改变了你班级的名字这一事实。遵循广泛了解的命名约定非常重要。
答案 6 :(得分:-1)
long s1 = ((Class)o1).getSize();
抱怨的地方。我认为这解决了它:
if(o1 instanceof Class)
{
long s1 = ((Class)o1).getSize();
}
基本上,您无法保证o1
是Class