Memahami Ralat Pengkompil dalam Comparator.reversed() dengan Lambdas
Apabila cuba mengisih senarai objek Pengguna menggunakan ungkapan lambda untuk Pembanding, seperti:
List<User> userList = Arrays.asList(u1, u2, u3); userList.sort(Comparator.comparing(u -> u.getName()).reversed());
pengkompil mungkin memaparkan ralat menyatakan bahawa ia tidak dapat mencari kaedah getName() dalam pembolehubah u lambda. Isu ini berpunca daripada kelemahan dalam mekanisme inferens jenis pengkompil.
Untuk menyelesaikan ralat ini, kita perlu menetapkan jenis sasaran untuk lambda. Apabila mengisih menggunakan Comparator.comparing(), lambda mesti mengambil hujah dari jenis yang sama seperti objek dalam senarai.
Dalam baris pertama kod, di mana kita menggunakan rujukan kaedah, jenis sasaran disimpulkan daripada jenis parameter kaedah, iaitu Pengguna. Ini membolehkan pengkompil membuat kesimpulan dengan betul jenis u dalam lambda.
Walau bagaimanapun, dalam baris ketiga, di mana kita menggunakan ungkapan lambda dan bukannya rujukan kaedah, panggilan ke reversed() mengganggu jenis sasaran inferens. Pengkompil tidak boleh menyebarkan jenis sasaran kembali kepada penerima, meninggalkan anda dengan jenis Objek yang disimpulkan, yang tidak mempunyai kaedah getName().
Untuk menyelesaikan isu ini, kita boleh menggunakan rujukan kaedah atau nyatakan secara eksplisit jenis u dalam lambda, seperti:
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
Ini memastikan bahawa pengkompil boleh membuat kesimpulan yang betul taip untuk anda dalam lambda dan berjaya mengisih senarai mengikut pembanding yang ditentukan.
Atas ialah kandungan terperinci Mengapakah `Comparator.comparing().reversed()` Menyebabkan Ralat Pengkompil dengan Lambdas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!