2017-11-20 26 views
7

मैं जावा 1.8.0_151 उपयोग कर रहा हूँ और वहाँ कुछ कोड है कि संकलन नहीं करता है और मुझे समझ नहीं आता:Java8 सामान्य पहेली

Optional optional = Optional.of("dummy"); 
Optional<Boolean> result1 = optional.map(obj -> true);  // works fine 
boolean result2 = result1.orElse(false);     // works fine 
boolean result3 = optional.map(obj -> true).orElse(false); // compilation error: Incompatible types: required boolean, found object 
Object result4 = optional.map(obj -> true).orElse(false); // works fine 

कारण है कि यह result1 पर ठीक काम करता है लेकिन result3 पर संकलन त्रुटि देता है ?
अतिरिक्त जानकारी: result1 और result2 की तरह, result3 संकलन करने में सक्षम है:

  • पहली पंक्ति में, जब मैं OptionalOptional<String> को बदलने के लिए, result3 भी जब मैं 2 लाइनों में result3 तोड़ने
  • संकलन करने में सक्षम है
+4

संभावित डुप्लिकेट [कच्चे प्रकार का क्या है और हमें इसका उपयोग क्यों नहीं करना चाहिए?] (Https://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt -we-use-it) – Andrew

+2

@AndrewTobilko ओपी हो सकता है * उद्देश्य पर * – Eugene

उत्तर

0

धन्यवाद। मैं सिर्फ लेकिन क्यों यह resutl1 पर काम किया पर विवरण पर नहीं result3 देना चाहता हूँ: कच्चे प्रकार

Optional<Boolean> result1 = optional.map(obj -> true);  // works fine 
boolean result2 = result1.orElse(false);     // works fine 
boolean result3 = optional.map(obj -> true).orElse(false); // compilation error: Incompatible types: required boolean, found object 
result1 पर

, optional चर था, इसलिए optional.map(obj -> true) एक Optional कच्चे प्रकार लौट आए।

जब मैं घोषित Optional<Boolean> result1, Optional कच्चे प्रकार स्वचालित रूप से Optional<Boolean>
को
casted दूसरी ओर था, optional.map(obj -> true).orElse(false); विफल हो गया क्योंकि एक कच्चे प्रकार Optional वस्तु कॉल नहीं कर सकते .orElse(false)

कच्चे प्रकार के साथ इस व्यवहार का एक और उदाहरण है :

List li = new ArrayList<String>(); 
List<String> li1 = li; 
List<Integer> li2 = li; 
List<Map> li3 = li; 

li1.add("WWW"); 
li2.add(444); 
li3.add(new HashMap()); 

सभी स्थितियों के लिए ठीक काम करेंगे, li वस्तु वाई एक स्ट्रिंग, एक इंटीजर और एक हैश मैप() होगा। li1, li2, li3 को स्वचालित रूप से गैर-कच्चे प्रकार में डाला गया था।

4

optional एक कच्चे Optional तो optional.map(obj -> true) एक कच्चे Optional देता है, और orElse(false) रिटर्न है, एक Object, एक Boolean नहीं। संकलक यह नहीं पता कि अन-बॉक्स के लिए एक Objectboolean करने के लिए।

Optional optional = Optional.of("dummy"); 

बदलते

Optional<Object> optional = Optional.of("dummy"); 

या

Optional<String> optional = Optional.of("dummy"); 

आपको यह त्रुटि को दूर करने होंगे, क्योंकि अब optional.map(obj -> true) एक Optional<Boolean> वापस आ जाएगी और orElse(false) एक Boolean लौट जाएगा।

+0

मुझे डर 'वैकल्पिक.मैप (obj -> true);' कच्चे 'वैकल्पिक' वापस नहीं लौटाता है, लेकिन 'वैकल्पिक ' क्योंकि रेखा: 'वैकल्पिक परिणाम 1 = वैकल्पिक.एमएपी (ओबीजे -> सत्य);' ठीक काम करता है – HenryNguyen

+3

@ हेनरी वास्तव में एक कच्चे प्रकार को असाइन किया जा सकता है। सामान्य प्रकार के लिए, ताकि असाइनमेंट का मतलब यह न हो कि आप क्या सोचते हैं ऐसा होता है। – Eran

+0

ओह्ह्ह वाह वाह मुझे यह नहीं पता था, धन्यवाद! – HenryNguyen

8

एक बार जब आप प्रकार सुरक्षा खो - यह श्रृंखलित कॉल के लिए खो दिया है के रूप में अच्छी तरह से। यही कारण है कि Optional<Object> != Optional है। तो जब आप

Optional optional = Optional.of("dummy"); 
optional.map() 

कर map केवल एक कच्चे Function और कुछ नहीं है, जो एक Object स्पष्ट रूप से वापस आ जाएगी स्वीकार कर सकते हैं।

सही तरीका प्रकार की जानकारी को जोड़ने के लिए है:

Optional<String> optional = Optional.of("dummy"); 

या आप unsafely डाली कर सकते हैं: अपने जवाब के लिए

boolean result3 = (boolean) optional.map(obj -> true).orElse(false)