2016-04-18 8 views
12

मुझे उत्सुकता थी कि रिटर्न प्रकार वाले लैम्ब्डा को Runnable पर क्यों नहीं डाला जा सकता है जबकि एक गैर-शून्य विधि संदर्भ हो सकता है।लैम्ब्डा कास्टिंग नियम

Runnable r1 =() -> 1; // not allowed 
// error: incompatible types: bad return type in lambda expression 
// int cannot be converted to void 

Runnable r2 = ((Supplier)() -> 1)::get; // allowed 

उत्तर

14

Runnable इंटरफ़ेस वापसी प्रकार शून्य के साथ run विधि को परिभाषित करता है। लैम्ब्डा अभिव्यक्ति में इसका अर्थ है कि तीर -> के बाद वाला भाग कथन होना चाहिए। यह JLS §15.27.3 में समझाया गया है:

तो समारोह प्रकार के परिणाम शून्य है, लैम्ब्डा शरीर या तो एक बयान अभिव्यक्ति (§14.8) या एक शून्य-संगत ब्लॉक है।

JLS $14.5 स्पष्ट रूप से एक कथन के वाक्यविन्यास को परिभाषित करता है। जैसा कि ऊपर बताया गया है, यह "अभिव्यक्ति स्टेटमेंट" होना चाहिए (§ 14.8)। वहां देखकर, आप पाते हैं कि एक साधारण शाब्दिक पर्याप्त अभिव्यक्ति नहीं है, लेकिन एक विधि आमंत्रण है (भले ही यह कुछ देता है)।

+1

क्या आप इंगित कर सकते हैं कि जेएलएस में कहां बताया गया है कि, उस स्थिति में, "तीर के बाद वाला हिस्सा" -> '_statement_ होना चाहिए"? मुझे इसके लिए देखना है। – Tunaki

+2

@ टुनकी इसे मिला, यह [§15.27.3] है (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.3)। – RealSkeptic

+1

@RealSkeptic Ha वास्तव में सही है: * यदि फ़ंक्शन प्रकार का परिणाम शून्य है, तो लैम्ब्डा बॉडी या तो एक कथन अभिव्यक्ति (§14.8) या शून्य-संगत ब्लॉक है। * और प्राथमिक अभिव्यक्ति एक कथन अभिव्यक्ति नहीं है (और isn ' टी ब्लॉक)। – Tunaki

संबंधित मुद्दे