Java Comparator警告

时间:2013-05-23 13:23:47

标签: java

我使用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;
        }
    }
}

7 个答案:

答案 0 :(得分:3)

这两行包含不安全的强制转换:

long s1 = ((Class)o1).getSize();
long s2 = ((Class)o2).getSize();

不安全的强制转换是这个表达式:(Class)o1,你将o1作为一个对象转换为一个类,而不事先检查o1Class的实例

如果为方法提供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();
}  

基本上,您无法保证o1Class