Ralat Java: "Kaedah Perbandingan Melanggar Kontrak Umumnya"
Apabila menyusun koleksi, Java menggunakan kaedah perbandingan untuk mewujudkan susunan objek. Walau bagaimanapun, kaedah ini mesti mematuhi prinsip transitivity, yang menyatakan bahawa jika objek A lebih besar daripada B dan B lebih besar daripada C, maka A mesti lebih besar daripada C. Dalam keadaan tertentu, kontrak ini boleh dilanggar, yang membawa kepada " Kaedah perbandingan melanggar ralat kontrak amnya.
Contoh
Pertimbangkan pembanding tersuai berikut, bertujuan untuk mengisih objek berdasarkan kriteria tertentu. Walau bagaimanapun, disebabkan ketidakkonsistenan logik, ia melanggar peraturan transitiviti:
@Override public int compareTo(Object o) { ... if (card1.getRarity() < card2.getRarity()) { return 1; } ... if (card1.getSet() > card2.getSet()) { return -1; } ... }
Isu Transitiviti
Dalam contoh di atas, jika card1.getRarity() ialah penentu factor dan card1.getRarity() adalah kurang daripada card2.getRarity(), pembanding mengembalikan dengan betul 1. Walau bagaimanapun, jika card2.getSet() ialah faktor penentu dan card2.getSet() adalah kurang daripada card1.getSet(), pembanding tersilap mengembalikan -1. Ini mengakibatkan situasi bukan transitif.
Penyelesaian Betul
Untuk memastikan transitiviti, pembanding harus mematuhi logik berikut:
if (card1.getRarity() < card2.getRarity()) { return 1; } if (card1.getRarity() > card2.getRarity()) { return -1; } ...
Ringkasnya, untuk mengelakkan ralat "Kaedah perbandingan melanggar kontrak amnya", pastikan kaedah pembanding anda mematuhi prinsip transitiviti. Peraturan ini menetapkan bahawa jika objek A lebih besar daripada B dan B lebih besar daripada C, maka A mesti lebih besar daripada C. Dengan memastikan transitif, anda menjamin tingkah laku pengisihan yang konsisten dan betul.
Atas ialah kandungan terperinci Mengapa Pembanding Java Saya Melemparkan Ralat 'Kaedah Perbandingan Melanggar Kontrak Amnya'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!