यह कंपाइलर के टाइप अवर तंत्र में एक कमजोरी है। u
लैम्ब्डा के प्रकार का अनुमान लगाने के लिए, लैम्ब्डा के लिए लक्ष्य प्रकार को स्थापित करने की आवश्यकता है। यह निम्नानुसार पूरा किया जाता है। userList.sort()
प्रकार के तर्क की अपेक्षा कर रहा है Comparator<User>
। पहली पंक्ति में, Comparator.comparing()
लौटने की जरूरत है Comparator<User>
। यह है कि संकेत मिलता है Comparator.comparing()
एक की जरूरत है Function
कि एक लेता User
तर्क। इस प्रकार पहली पंक्ति में लैम्ब्डा में, u
प्रकार User
और सब कुछ काम करना चाहिए ।
दूसरी और तीसरी पंक्ति में, कॉल करने की उपस्थिति से लक्ष्य टाइपिंग बाधित होती है reversed()
। मुझे पूरा यकीन नहीं है कि क्यों; रिसीवर और रिटर्न प्रकार दोनों reversed()
हैं Comparator<T>
इसलिए ऐसा लगता है कि लक्ष्य प्रकार को वापस रिसीवर को प्रचारित किया जाना चाहिए, लेकिन यह नहीं है। (जैसा मैंने कहा, यह एक कमजोरी है।)
दूसरी पंक्ति में, विधि संदर्भ अतिरिक्त प्रकार की जानकारी प्रदान करता है जो इस अंतर को भरता है। यह जानकारी, तीसरी पंक्ति में अनुपस्थित रहती है तो संकलक infers u
होने के लिए Object
(अंतिम उपाय के अनुमान फ़ॉलबैक) है, जो विफल रहता है।
जाहिर है अगर आप एक विधि संदर्भ का उपयोग कर सकते हैं, तो वह करें और यह काम करेगा। कभी-कभी आप एक विधि संदर्भ का उपयोग नहीं कर सकते हैं, उदाहरण के लिए, यदि आप एक अतिरिक्त पैरामीटर पास करना चाहते हैं, तो आपको एक लैम्ब्डा अभिव्यक्ति का उपयोग करना होगा। उस स्थिति में आप लैम्बडा में एक स्पष्ट पैरामीटर प्रकार प्रदान करेंगे:
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
यह संभव है कि कंपाइलर को भविष्य के रिलीज में इस मामले को कवर करने के लिए बढ़ाया जाए।