Rumah > Java > javaTutorial > Mengapa Inferens Jenis Pembanding Java 8 Gagal Apabila Merangkai Panggilan `kemudian Membandingkan`?

Mengapa Inferens Jenis Pembanding Java 8 Gagal Apabila Merangkai Panggilan `kemudian Membandingkan`?

Susan Sarandon
Lepaskan: 2024-11-28 12:53:11
asal
416 orang telah melayarinya

Why Does Java 8 Comparator Type Inference Fail When Chaining `thenComparing` Calls?

Kekeliruan Inferens Jenis Pembanding Java 8

Java 8 memperkenalkan penambahbaikan kepada penggunaan Pembanding melalui ungkapan lambda. Walau bagaimanapun, apabila merantai berbilang panggilan kemudian Membandingkan, jenis inferens boleh menjadi tidak jelas. Isu ini berpunca daripada fakta bahawa ungkapan lambda kekurangan inferens jenis sebagai ungkapan penerima kaedah.

Penjalinan Pembanding dan Inferens Jenis

Pertimbangkan kod berikut:

Comparator<String> c1 = Comparator.comparing(String::length);
Comparator<String> c2 = c1.thenComparing(String::compareToIgnoreCase);
Salin selepas log masuk

Baris pertama menggunakan rujukan kaedah tanpa parameter jenis, yang mencetuskan inferens jenis berdasarkan jenis pulangan daripada String::length. Jenis ini digunakan untuk membuat kesimpulan jenis p1 dalam kaedah thenComparing.

Walau bagaimanapun, dalam situasi seperti ini:

Collections.sort(list, c1.thenComparing(String::compareToIgnoreCase)); // Error: cannot resolve method
Salin selepas log masuk

Inferens jenis gagal kerana kaedah Collections.sort tidak mempunyai jenis tertentu maklumat untuk c1. Untuk menyelesaikan isu ini, kami boleh menyediakan parameter jenis eksplisit:

Collections.sort(list, c1.thenComparing(Comparator.comparing(String::compareToIgnoreCase)));
Salin selepas log masuk

Isih Senarai lwn. Koleksi

Dalam List.sort, inferens jenis dilakukan secara berbeza. Pertimbangkan:

list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase)); // No error
Salin selepas log masuk

Di sini, inferens jenis tidak diperlukan kerana Comparator dicipta terus dalam kaedah isihan, memberikan maklumat jenis yang diperlukan. Walau bagaimanapun, ini hanya berlaku untuk panggilan pertama kemudian Membandingkan. Panggilan berikutnya tanpa parameter jenis eksplisit akan mengakibatkan ralat.

Ralat Khusus Eclipse

Perlu ambil perhatian bahawa ralat yang anda temui mungkin khusus Eclipse. Menyusun kod dengan pengkompil javac JDK 8 selalunya menyelesaikan isu ini.

Atas ialah kandungan terperinci Mengapa Inferens Jenis Pembanding Java 8 Gagal Apabila Merangkai Panggilan `kemudian Membandingkan`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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