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);
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
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)));
Isih Senarai lwn. Koleksi
Dalam List.sort, inferens jenis dilakukan secara berbeza. Pertimbangkan:
list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase)); // No error
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!