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

Mengapakah `Comparator.reversed()` Menyebabkan Ralat Penyusunan dengan Ungkapan Java Lambda?

Susan Sarandon
Susan Sarandonasal
2024-12-15 06:22:11193semak imbas

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

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, memandangkan userList.sort() menjangkakan hujah jenis itu. Ini menyimpulkan anda adalah jenis Pengguna, membenarkan kod untuk menyusun.

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!

Kenyataan:
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