2017-05-11 15 views
6

इम निम्न विधि के साथ काम:सरणी प्रकार की उम्मीद [संकलन त्रुटि]

public void m(List<? extends Object[]> objs){ 
    objs.stream() 
     .map(oa -> oa[0]) //compile error 
          //array type expected 
     .forEach(System.out::println); 

} 

DEMO

यह क्यों काम नहीं करता है? मैंने सोचा कि सरणी को विस्तारित करने वाली हर चीज को सरणी के रूप में देखा जा सकता है। असल में मैं सरणी से length प्राप्त कर सकता हूं।

+1

Downvoter, तो आप बहुत दयालु हो सकता है और टिप्पणियों में स्पष्टीकरण दें कि यह काम नहीं करता होगा: प्रत्येक सरणी एक निश्चित प्रकार और अपने ही वर्ग, जैसे MyClass[].class

आप का उपयोग करना चाहिए एक टाइप किया विधि है? मुझे स्पष्ट रूप से 'ऑब्जेक्ट []' पर क्यों डालना होगा? –

+3

यदि आप 'एम (सूची objs को बढ़ाते हैं)' to 'm (सूची objs) 'यह संकलित करता है, लेकिन मैं जवाब नहीं दे रहा हूं क्योंकि मुझे इस परिवर्तन के प्रभाव या गलत क्या नहीं है आपके मूल के साथ। –

+0

@StephenP अनजाने में मैं हस्ताक्षर नहीं बदल सकता। –

उत्तर

5

वास्तव में ऐसा कोई वर्ग नहीं है जो Object[] बढ़ाता है;

public <T> void m(List<T[]> objs){ 
    objs.stream() 
      .map(oa -> oa[0]) // no compile error 
      .forEach(System.out::println); 

} 
+1

कभी सोचा नहीं, लेकिन वास्तव में 'वर्ग MyClass ऑब्जेक्ट बढ़ाता है [] {} 'संकलित नहीं करता है। –

+0

@ सेंटएन्टारियो सरणी एक 'मूल' प्रत्यारोपण है - आप उनके साथ कुछ भी नहीं कर सकते हैं – Bohemian

+2

@ बोहेमियन नाइट यह कार्यान्वयन कारण नहीं है जो इसे रोकता है, विनिर्देश द्वारा प्रतिबंधित है। (मेरे फोन पर जेएलएस के प्रासंगिक खंड को ढूंढने में विफल ...) –

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