2017-08-03 28 views
6

प्रकार के चर के लिए लैम्ब्डा अभिव्यक्ति असाइन करना जावा कम्पाइलर पहले कथन के बारे में शिकायत क्यों कर रहा है, ऐसा इसलिए है क्योंकि अभिव्यक्ति () -> "" का कोई निश्चित प्रकार नहीं है, मेरा मतलब है कि यह Supplier <String> हो सकता है या एक कस्टम कार्यात्मक इंटरफ़ेस प्रकार, आदि ...?जावा 8 प्रकार अनुमान त्रुटि, ऑब्जेक्ट

Object emptyStringBuilder =() -> ""; // causes compiler error 

Object emptyStringBuilder = (Supplier<String>)() -> ""; 

क्या आप सही कारणों पर विस्तृत जानकारी दे सकते हैं?

उत्तर

1

एक लैम्ब्डा अभिव्यक्ति के लिए प्रकार निष्कर्ष लक्ष्य प्रकार से होता है, जिसका अर्थ है जब आप उदाहरण के लिए कुछ इस तरह लिखना:

() -> ""; 

वास्तव में एक Supplier (आप के लिए, संकलक नहीं) है, लेकिन क्या हुआ यदि मैं प्रकार इस तरह की घोषणा की है:

static interface Producer<T> { 
    T produce(); 
} 

इसका मतलब यह है कि आपके लैम्ब्डा एक Producer या एकहो सकता है। इस प्रकार बताए एक @FunctionalInterface (या कास्टिंग) करने के लिए किया जाना है ताकि प्रकार निष्कर्ष हो सकता है।

+0

, धन्यवाद सटीक उत्तर मैं के लिए देख रहा था। – marsouf

3

लैम्ब्डा अभिव्यक्ति @FunctionalInterface लागू करता है - सिर्फ एक सार्वजनिक गैर स्थिर और गैर-डिफ़ॉल्ट विधि के साथ एक इंटरफेस। Object, क्योंकि यह आपके लैम्ब्डा अभिव्यक्ति का एक प्रकार अनुमान नहीं लगा सकता - पहला मामला संकलक में बाईं ओर से टाइप हो जाता है। कंपाइलर आपके लिए कोई इंटरफ़ेस नहीं उठाएगा। और Object कार्यात्मक इंटरफ़ेस को लागू नहीं करता, इसलिए संकलक इस स्थिति के बारे में शिकायत।

दूसरे मामले में आप कार्यात्मक इंटरफ़ेस Supplier<T> का उपयोग करें और आप एक Object जो संकलन के मामले में सही है के लिए असाइन करें - संकलक क्योंकि आप (उस मामले में Supplier<T>) अपने विशिष्ट प्रकार नीचे डाली एक सबसे सामान्य Object को संतुष्ट किया जाता है (हर कक्षा Object कक्षा से विरासत में है)।

+0

प्रकार वस्तु के एक चर कार्यात्मक इंटरफ़ेस की ओर इशारा करते नहीं हो सकता है -

JLS इन में पाली भाव (जेनरिक, विधि संदर्भ, त्रिगुट ऑपरेटर की तरह वे भी संदर्भ में क्यों इस्तेमाल कर रहे हैं पर निर्भर करते हैं) के रूप में परिभाषित कर रहे हैं? मुझे लगता है कि त्रुटियों का कारण कंपाइलर से आता है, सही दाहिने तरफ अभिव्यक्ति के सटीक प्रकार का अनुमान नहीं लगा सकता है जो किसी भी कार्यात्मक इंटरफ़ेस को इंगित कर सकता है जिसमें इसकी सार विधि का हस्ताक्षर "कुछ नाम()" नहीं है? – marsouf

+1

सही। कंपाइलर सटीक प्रकार का अनुमान नहीं लगा सकता है क्योंकि खाली लैम्ब्डा अभिव्यक्ति को कई अलग-अलग कार्यात्मक इंटरफेस द्वारा दर्शाया जा सकता है। जावा के रूप में स्थिर संकलित भाषा संकलन स्तर पर सही प्रकार पता करने के लिए है और यह आप के लिए सही प्रकार नहीं चुन सकते। इस तरह मैं इसे समझता हूं। –

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