Perangkap Pengkompil: Comparator.reversed() dan Ungkapan Lambda
Ekspresi Lambda menyediakan cara ringkas untuk menyesuaikan gelagat pengisihan, tetapi apabila digunakan dengan Comparator.reversed(), ralat kompilasi timbul. Ralat ini berpunca daripada ketidakupayaan pengkompil untuk membuat kesimpulan jenis sasaran yang betul untuk lambda.
Memahami Ralat
Pertimbangkan kod sampel berikut:
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error
Dalam kes ini, ralat berlaku kerana pengkompil tidak dapat menentukan jenis parameter u dalam lambda ungkapan. Untuk membuat kesimpulan jenis, pengkompil memerlukan jenis sasaran untuk lambda.
Biasanya, jenis sasaran ditentukan oleh konteks di mana lambda digunakan. Dalam baris pertama coretan kod yang anda berikan, jenis sasaran ialah Comparator
Lambda vs. Rujukan Kaedah
Ralat hanya berlaku apabila menggunakan ungkapan lambda. Apabila menggunakan rujukan kaedah (seperti dalam baris kedua coretan kod anda), jenis sasaran disediakan secara eksplisit oleh tandatangan kaedah, menyelesaikan isu inferens jenis.
Menyelesaikan Ralat
Untuk menyelesaikan ralat apabila menggunakan ungkapan lambda, anda boleh memberikan parameter secara eksplisit jenis:
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
Ini secara jelas menyatakan anda sebagai Pengguna jenis, membenarkan pengkompil untuk membuat kesimpulan jenis sasaran dengan betul.
Kelemahan Penyusun
Ralat yang dipersoalkan menyerlahkan kelemahan dalam mekanisme inferens jenis penyusun. Sebab tepat mengapa kaedah terbalik() mengganggu penaipan sasaran tidak jelas. Penambahbaikan pengkompil masa hadapan boleh menangani isu ini, membenarkan ungkapan lambda digunakan tanpa menaip parameter eksplisit.
Atas ialah kandungan terperinci Mengapakah `Comparator.reversed()` Menyebabkan Ralat Penyusunan dengan Ungkapan Java Lambda?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!