Saturday 15 January 2011

java - Compilation fails when using a lambda for Supplier<? extends Type> -


यह क्यों संकलित नहीं है? :

<पूर्व> आयात करें java.util.Optional; सार्वजनिक वर्ग के डेमो {वैकल्पिक>

यह बिना किसी समस्या के काम करता है जब getOption () एक वैकल्पिक वापस करेगा।

यह एक सीमित प्रतिबंधित विधि हस्ताक्षर का परिणाम है:

  सार्वजनिक T orElseGet (आपूर्तिकर्ता & lt ;? T & gt; अन्य का विस्तार करता है) {  

आपके मामले में, T है ? कुछ वैल्यू फैलता है जो एक अज्ञात प्रकार है जो SomeValue के लिए असाइन किया जा रहा है (लेकिन यह एक उपवर्ग हो सकता है)। orElseGet के हस्ताक्षर का अर्थ है कि आपके सप्लायर को T के उपप्रकार वापस करने की अनुमति है, जिसके परिणामस्वरूप T के समग्र परिणाम का प्रकार होता है लेकिन यह अनुमति नहीं देता है एक सामान्य आधार प्रकार T को चौड़ा करने के लिए और आपके आपूर्तिकर्ता के प्रकार (यदि आपका सप्लायर रिटर्न SomeValue और T है कुछ वैल्यू बढ़ाता है, सामान्य आधार प्रकार कुछ वैल्यू होगा।)

आप एक ऑपरेशन डालकर इसे ठीक कर सकते हैं जो इस प्रकार की चौड़ाई को अनुमति देता है:

  कुछ वैल्यू कुछ वैल्यू = getOption () .मैप (फ़ंक्शन। & Lt; SomeValue & gt; पहचान ()) orElseGet (() - & gt; नया कुछ वैल्यू ());  

पहचान फ़ंक्शन वैल्यू बदल नहीं करता है, लेकिन मैपिंग ऑपरेशन एक व्यापक प्रकार का उपयोग करने वाला फ़ंक्शन पास करने की अनुमति देता है, अर्थात मैपिंग फ़ंक्शन उपभोग करने की घोषणा कर सकता है कुछ वैल्यू जब वास्तविक इनपुट प्रकार है? कुछ वैल्यू बढ़ाता है और वापसी का प्रकार कुछ वैल्यू है।


लेकिन आम तौर पर, इस तरह की समस्याओं से बचने के लिए, तरीकों को उनके रिटर्न प्रकारों में वाइल्डकार्ड नहीं होना चाहिए, इसलिए परिवर्तन <पूर्व> वैकल्पिक & lt ;? कुछ वैल्यू & gt; फैलता है GetOption ()

से

  वैकल्पिक & lt; SomeValue & gt; एक वाइल्डकार्ड का उपयोग एक वापसी के प्रकार से किया जाना चाहिए क्योंकि यह प्रोग्रामर को वाइल्डकार्ड से निपटने के लिए कोड का उपयोग करने के लिए बाध्य करता है। 

>

No comments:

Post a Comment