2014-09-15 8 views
8

मैं कार्रवाई में हाल में जारी जावा 8 पढ़ रहा हूँ और पाया कि अध्याय 5 से चिपकाया कोड का एक टुकड़ा संकलन नहीं है:ग्रहण में प्रकार अनुमान संकलन का उपयोग कर यह जावा 8 उदाहरण क्यों नहीं था?

List<Integer> numbers1 = Arrays.asList(1, 2, 3); 
    List<Integer> numbers2 = Arrays.asList(3, 4); 
    List<int[]> pairs = 
    numbers1.stream() 
    .flatMap((Integer i) -> numbers2.stream() 
    .map(j -> new int[]{i, j}) 
    ) 
    .collect(toList()); 

ग्रहण कहते हैं:

: "प्रकार बेमेल List<Object> से List<int[]> को परिवर्तित नहीं कर सकते"

और क्या लेखक Github पर दिया साथ तुलना करने के बाद, संकलित निम्नलिखित:

List<Integer> numbers1 = Arrays.asList(1, 2, 3); 
    List<Integer> numbers2 = Arrays.asList(3, 4); 
    List<int[]> pairs = 
    numbers1.stream() 
    .flatMap((Integer i) -> numbers2.stream() 
    .map((Integer j) -> new int[]{i, j}) 
    ) 
    .collect(toList()); 

केवल परिवर्तन करने के लिए "j" "(पूर्णांक जे)" से है।

लेकिन जावा 8 द्वारा प्रदान की गई वाक्यविन्यास चीनी के साथ दूसरे संस्करण के बराबर पहला संस्करण नहीं है? जावा इसे संकलित करने से इंकार क्यों करता है?

धन्यवाद

Btw:

java -version 
java version "1.8.0_20" 
Java(TM) SE Runtime Environment (build 1.8.0_20-b26) 
Java HotSpot(TM) Client VM (build 25.20-b23, mixed mode) 
+0

* Argh * यह एक पुस्तक में मुद्रित है ?! – tilois

+0

पूरी तरह से नहीं। प्रश्न को स्पष्ट करने के लिए थोड़ा सा संशोधित किया गया। –

+0

शीर्षक को संपादित करने के लिए यह दर्शाता है कि मूल कारण ग्रहण में है। –

उत्तर

15

पहले, अपने शब्दावली को सही: जब आप कहते हैं वाक्य रचना चीनी, क्या तुम सच में के बारे में पूछ रहे हैं प्रकार निष्कर्ष, कि एक अनुमान लगाने के लिए जब उनसे पूछा गया है आंतरिक लैम्बडा में j के लिए टाइप करें, कि संकलक सही प्रकार के साथ आने में विफल रहता है।

दूसरा, आपके डेटा को सही करना: आपके द्वारा उद्धृत त्रुटि संदेश जेडीके कंपाइलर से नहीं आ रहे हैं; वे ग्रहण से आ रहे हैं।

यह सिर्फ एक ग्रहण बग है। संदर्भ संकलक (ओरेकल जेडीके से javac) आपके पहले उदाहरण को ठीक से संभालता है।

+2

+1 और एक और डायग्नोस्टिक बिट जोड़ना: 'स्ट्रीम जोड़े = संख्या 1.स्ट्रीम()। फ्लैटमैप (i -> numbers2.stream()। नक्शा (जे -> नया int [] {i, j}); '' ठीक संकलित करता है, इसलिए केवल अंतिम चरण ('.collect()') है जहां अनुमान विफल रहता है। –

+0

पुष्टि की है कि यह ग्रहण के बारे में है। जावैक ने क्लास फाइल को ठीक बनाया। धन्यवाद/ –

+0

ग्रहण इन लम्बास के साथ अच्छा खेलने के लिए ग्रहण कैसे प्राप्त करें? – Yoshiya

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