2012-03-30 14 views
15

मैं दो सूचियों को तय करना चाहता हूं: सबसे पहले इंटीजर की एक सूची है। मैं इसे इस प्रकार घोषित करता हूं:जेनेरिक सूचियों की घोषणा में अंतर क्यों है?

List<Integer> ints= Arrays.asList(1,2,3); 

यह ठीक काम करता है।

दूसरा ऑब्जेक्ट्स की एक सूची है। मैं इसे इस प्रकार घोषित करता हूं:

List<Object> objs= Arrays.asList(1,2.13,"three"); 

लेकिन जैसे ही मैं इसे लिखता हूं, ग्रहण में त्रुटि देता है। त्रुटि है:

Multiple markers at this line 
- Type mismatch: cannot convert from List<Object&Comparable<?>&Serializable> to 
List<Object> 
- Type safety: A generic array of Object&Comparable<?>&Serializable is created for 
     a varargs parameter 

इसके बजाय अगर मैं लिखने

List<Object> objs = Arrays.<Object>asList(1,2.13,"three"); 

यह ठीक काम करता है।

मैं कारण समझने में सक्षम नहीं हूं।

उत्तर

14

this post on stackoverflow पर देखें।

15.12.2.7 का निष्कर्ष निकालते प्रकार तर्क वास्तविक तर्क के आधार पर

एक महाप्रकार बाधा टी:> एक्स का तात्पर्य है कि समाधान टी पर कई बाधाओं को देखते हुए, हम कर सकते हैं एक्स के में से एक supertypes है प्रत्येक बाधाओं द्वारा उल्लिखित सुपरटेप के सेट को छेड़छाड़ करें, क्योंकि टाइप पैरामीटर उन सभी का सदस्य होना चाहिए। हम तो सबसे विशिष्ट प्रकार चौराहे

String, Double और Integer के बीच सबसे प्रतिबंधात्मक प्रकार चौराहे है दोनों इंटरफेस Comparable और Serializable में है चुन सकते हैं। तो जब आप

Arrays.asList(1,2.13,"three"); 

बारे में यह T infers implements Comparable<?>, Serializable होने के लिए तो फिर यह के रूप में अगर है आप

List<Object> objs = new List<T extends Comparable<?>, Serializable> 

कर रहे हैं जाहिर है, इस अनुमति नहीं है।
दूसरी ओर, जब आप Object निर्दिष्ट स्पष्ट

Arrays.<Object>asList(1,2.13,"three"); 

कोई निष्कर्ष

किया जाता है का उपयोग कर
+0

समझ गया। बेहद अच्छी व्याख्या के लिए धन्यवाद। इस तरह के भ्रम के मामले में आवेदन करने के लिए यह एक सुनहरा नियम होगा। –

2

उपयोग इस काम करता है सही

List<? extends Object> objs = Arrays.asList(10,20.32,"test"); 

System.out.println(objs); 

आउटपुट: [10, 20.32, परीक्षण]

+3

यह ठीक है, लेकिन ध्यान दें कि जहां तक ​​कंपाइलर का संबंध है, 'सूची ' नहीं * * सूची <जैसा ही है? ऑब्जेक्ट> 'बढ़ाता है, और ओपी को' सूची ' – Bohemian

+1

-1 की आवश्यकता हो सकती है जैसा ओपी ने कहा, 'Arrays। asList (1,2.13, "तीन") 'ठीक काम करता है।सवाल यह था कि संकलक 'ऑब्जेक्ट' का अनुमान लगाने में विफल रहता है, न कि समाधान को कैसे हैक करना है। –

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