Rumah > Java > javaTutorial > Mengapakah `Comparator.reversed()` Menyebabkan Ralat Penyusunan dengan Beberapa Ungkapan Lambda di Jawa?

Mengapakah `Comparator.reversed()` Menyebabkan Ralat Penyusunan dengan Beberapa Ungkapan Lambda di Jawa?

Mary-Kate Olsen
Lepaskan: 2024-12-03 14:51:14
asal
485 orang telah melayarinya

Why Does `Comparator.reversed()` Cause Compilation Errors with Some Lambda Expressions in Java?

Comparator.reversed() Ketidakserasian dengan Ungkapan Lambda

Apabila cuba mengisih senarai menggunakan ungkapan lambda dan kaedah terbalik() bagi Comparator , ralat kompilasi timbul. Untuk memahami tingkah laku ini, adalah penting untuk menyelidiki selok-belok mekanisme inferens jenis pengkompil.

Pengkompil Java menentukan jenis pembolehubah dalam ungkapan lambda berdasarkan konteks di mana ia digunakan. Dalam kes ini, kaedah isihan menjangkakan hujah jenis Comparator. Apabila menggunakan rujukan kaedah, jenis penerima sudah diketahui, dan hujah lambda disimpulkan dengan sewajarnya. Contohnya:

userList.sort(Comparator.comparing(User::getName).reversed()); // works
Salin selepas log masuk

Walau bagaimanapun, apabila menggunakan ungkapan lambda secara langsung, pengkompil bergelut untuk membuat kesimpulan jenis pembolehubah dalam lambda. Jenis sasaran untuk lambda ialah Comparator, yang memerlukan Fungsi yang mengambil Pengguna sebagai hujah. Dalam kod berikut, lambda menyimpulkan anda dengan betul sebagai Pengguna:

userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // works
Salin selepas log masuk

Walau bagaimanapun, jika tiada rujukan kaedah, pengkompil lalai untuk membuat kesimpulan jenis u sebagai Objek, mengakibatkan ralat penyusunan:

userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error
Salin selepas log masuk

Untuk menyelesaikan isu ini, seseorang boleh sama ada menggunakan rujukan kaedah jika boleh atau nyatakan secara eksplisit jenis parameter dalam ungkapan lambda:

userList.sort(Comparator.comparing((User u) -> u.getName()).reversed()); // works
Salin selepas log masuk

Walaupun pengehadan ini boleh mengecewakan, ini adalah akibat daripada mekanisme inferens jenis pengkompil. Penambahbaikan penyusun masa hadapan boleh menangani isu ini.

Atas ialah kandungan terperinci Mengapakah `Comparator.reversed()` Menyebabkan Ralat Penyusunan dengan Beberapa Ungkapan Lambda di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan