Папярэджанне аб Java кампаратара

Я выкарыстоўваю кампаратар для параўнання файлаў па памеры, але калі я спрабаваў скампіляваць мой код я атрымаў папярэджанне: «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
Якая лінія мае папярэджанне?
дададзена аўтар thegrinner, крыніца
Магчымы дублікат stackoverflow.com/questions/197986/…
дададзена аўтар Joetjah, крыніца
Што такое Клас ? Там няма GETSIZE() у java.lang.Class .
дададзена аўтар johnchen902, крыніца

7 адказы

Гэтыя два радкі ўтрымліваюць небяспечныя кідкі:

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

The unsafe cast is this expression: (Class)o1, you cast o1 which is an object to a Class, without previously checking that o1 is an instance of Class

Ваша праграма працуе добра, калі вы дае асобнікі класа метады. Праблема заключаецца ў тым, што вы не можаце быць упэўнены, што ніхто не называе юр метад з аб'ектам, які не з'яўляецца класам.

Вы павінны ажыццяўляць бяспечны кампаратар тыпу, пры ўмове, што ваша ява версія навей, што 1,4.

public class size implements Comparator {   
    @Override
    public int compare(Class o1, Class o2) {
       //compare the two class objects
3
дададзена
Але калі я выдаліць гэта кідае метад геттер не можа быць вырашана.
дададзена аўтар Erik, крыніца
Глядзіце мой адрэдагаваны адказ
дададзена аўтар nakosspy, крыніца
@Erik, дарэчы гэта ён java.lang.Class аб'екты тыя, якія вы спрабуеце параўнаць? Паколькі не існуе метаду GETSIZE() у java.lang.Class.
дададзена аўтар nakosspy, крыніца

declare your Comparator as a Comparator and replace the compare method with

compare(File o1, File o2)

EDIT : Or Comparator if you are comparing classes. This is what you seem to do

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() {
    @Override
    public int compare(File o1, File o2) {
        return new Long(o1.length()).compareTo(o2.length());
    }
});
2
дададзена
long s1 = ((Class)o1).getSize();

Дзе ён скардзіцца. Я думаю, што гэта фіксуе гэта:

if(o1 instanceof Class)  
{  
     long s1 = ((Class)o1).getSize();
}  

Essentially you have not guaranteed that o1 is a Class

1
дададзена

Гэта правільна. <�Код> Кампаратар з'яўляецца параметризованным інтэрфейсам, то ёсць клас, які вызначаны з абагульненнямі.

Гэта шлях, вы павінны рэалізаваць кампаратар, каб пазбегнуць як папярэджання і шанец, што ClassCasetException кінута:

public class SizeComparator implements Comparator {
......
}

Your comparator is kind of something special. It works with any object. This is a reason that I wrote Comparator here. In most cases you'd define class parameter more specifically and use the same class in compare() method, for example

public class SizeComparator implements Comparator {
     public int compare(String s1, String s2) {
         .......
     }
}

Дарэчы, у вашым выпадку вы можаце таксама вызначыць свой кампаратар наступным чынам:

public class SizeComparator implements Comparator {
     public int compare(T o1, T o2) {
         .......
     }
}

І звярніце ўвагу на тое, што я змяніў назву свайго класа. Важна прытрымлівацца шырока ведае правілы наймення.

0
дададзена

Па-першае, вы карыстаецеся кампаратар ў якасці сыравіннага тыпу. Гэта няправільна, дадаць аргумент тыпу да яго, а затым рэалізаваць (параўнайце, файл) .

Па-другое, прадукцыйнасць вашага кампаратара будзе страшна, таму што Даўжыня прыводзіць да натыўнай сістэмнага выкліку, каб даведацца памер файла.

Для вырашэння праблемы прадукцыйнасці вам неабходна стварыць клас-абалонку для файлаў. Ён можа рэалізаваць Супастаўныя непасрэдна:

public class FileBySize implements Comparable {
   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);
   }
}
0
дададзена

Вы павінны выкарыстоўваць o1.getClass() замест ліцця

0
дададзена