2012-11-15 25 views
6

मैं "प्रकार बेमेल: List<CherryCoke> से List<Coke<?>> को परिवर्तित नहीं कर सकते"क्या 'चेरी कोक्स' की सूची 'कोक्स की सूची' है?

यह एक 'चेरी cokes की सूची' की तरह दिखता है एक 'cokes की सूची' नहीं है। यह counterintuitive है। मैं इसे 'xs' कैसे बना सकता हूं, अगर इसे List<Coke<?>> होना चाहिए और मुझे का उप-वर्ग होना चाहिए?

class Taste { } 
class Cherry extends Taste { } 

abstract class Coke<T extends Taste> { }  

class CherryCoke extends Coke<Cherry> { } 

class x { 
    void drink() { 
    List<Coke<?>> xs = Arrays.asList(new CherryCoke()); 
    } 
} 
+0

यहाँ याद करने के लिए सबसे अधिक उपयोगी परिवर्णी शब्द [पी ई सी एस] है (http://stackoverflow.com/questions/2723397/java-generics-what-is-pecs)। 'कोक ' कुछ विशिष्ट नहीं है, इसलिए आप यह नहीं कह सकते कि "कोक्स की एक सूची चेरी कोक्स की एक सूची है," लेकिन आप 'का उपयोग कर सकते हैं? कोक 'बढ़ाता है। अधिक जानकारी के लिए मैंने जो प्रश्न जोड़ा है, उसे देखें। – Brian

उत्तर

9

आप सही हैं - एक 'cokes की सूची' एक 'चेरी cokes की सूची' नहीं है - 'चीजें हैं जो कोक का विस्तार' की एक सूची है, हालांकि एक 'चेरी cokes की सूची' है।

आप शायद परिभाषित करने के लिए xsList <? extends Coke<?>> xs = Arrays.asList(new CherryCoke()); रूप

+1

यह वास्तव में अनावश्यक है। मेरा जवाब देखें –

4
List<Coke<?>> xs = Arrays.asList(new CherryCoke()); 

List<CherryCoke>List<Coke<?>> (कुछ भी कोक की सूची) के एक उप प्रकार नहीं है चाहता हूँ।

आपको अपने सामान्य प्रकार के ऊपरी भाग को परिभाषित करना चाहिए।

List<? extends Coke<?>> xs = Arrays.asList(new CherryCoke()); 
+0

* ऊपरी * -बाउंड क्या है? मैं उस शब्द को "बाधा" में बदल दूंगा ... यह आधिकारिक नाम है, आईआईआरसी, और यह भी स्वाभाविक रूप से सार्थक है, आईएमएचओ ... एक "बाध्य" आवाज जैसे हुड के नीचे एक सरणी है, जो नहीं है। – corlettk

+1

@ कोर्लेटटेक कृपया यहां जांचें http://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html – PermGenError

+4

कृपया सॉस पास करें। मुझे अपने शब्दों को खाने की ज़रूरत है, और वे खट्टा हैं! ;-) – corlettk

5

के रूप में अन्य लोगों ने बताया है, List<CherryCoke> और List<Coke<?>> एक ही बात नहीं कर रहे हैं।

लेकिन यह वास्तव में यहां मुद्दा नहीं है। xs को List<? extends Coke<?>> के रूप में टाइप करना आवश्यक नहीं है। आप बस एक नया List<Coke<?>> बनाया हो सकता है और फिर इसमें एक नया CherryCoke जोड़ा गया।

त्रुटि को संकलक asList के प्रकार पैरामीटर T गलत तरीके से कंपाइलर के साथ करना है। आप T निर्दिष्ट करते हैं यह अपने आप को संकलित करता है:

List<Coke<?>> xs = Arrays.<Coke<?>>asList(new CherryCoke()); 
+0

यह भी काम करता है। आप जिस समाधान का उपयोग करना चाहते हैं वह अंतर्निहित कार्यक्रम पर निर्भर हो सकता है यह कोड एक हिस्सा है। – Krease

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