2010-08-22 10 views
11

बढ़ाता है मुझे बस यह समझ में नहीं आता है।कच्चे <? ऑब्जेक्ट>

List list = new ArrayList(); 
List <? extends Object> list1 = list; // unchecked conversion warning. 

Object के बाद से जावा में उच्चतम ऊपरी बाध्य है, मैं किसी भी कारण नहीं दिख रहा है यही कारण है कि चेतावनी है।

अद्यतन 1:

AKF के जवाब के संबंध में

:

मैं पूरी तरह से समझते हैं कि आप क्या कह रहे हैं। मुझे पहले से यह पता है। लेकिन < ? extends Object> उच्चतम ऊपरी सीमा है। जिसका अर्थ है कि आपके पास कोई भी प्रकार है जो आप चाहते हैं। मूल रूप से <?> == <? extends Object>। क्यों यहाँ कोई चेतावनी

List list = new ArrayList(); 
List.add("a"); 
List <? extends Runnable> list1 = list; //warning here 

:

आप अपने कोड पर इस कोशिश कर सकते हैं और आप देखेंगे <?> == <? extends Objects>

अद्यतन 2: Sheng's answer करने के लिए

संबंध में?

List <?> list2 = list; // No warning here 

अद्यतन 3:

मैं सिर्फ ऊपर और अभी भी हैरान समीक्षा कर रहा हूँ।

के बाद से निम्नलिखित संकलक ने अनुमति दी है:

  1. List a = new ArrayList();

  2. List <?> b = a;

  3. List <? extends Object> c = a; // with warning of course

    for (Object obj : b) {} 
    // I don't agree with your statements above that &lt;?&gt; cannot be 
    
    // written in the for (:) loop as shown here 
    for (Object obj : c) {} 
    

दोनों अनुमत हैं। तो मैं अभी भी क्यों अनियंत्रित चेतावनी जब <? extends Object>

+5

अंतर यह है कि कच्चे साधन * कोई निर्दिष्ट प्रकार * और ' 'विशिष्ट विशिष्ट प्रकार की परिभाषा है। तो * कोई प्रकार * से * कुछ प्रकार * यह एक अनचेक रूपांतरण है। –

+0

फिर क्यों सूची 2 = सूची सूचीबद्ध करें; // काम करता है। यहां कोई चेतावनी नहीं है। यह किसी प्रकार के लिए कोई प्रकार भी निर्दिष्ट नहीं कर रहा है (केवल और पूर्व को बढ़ाया गया है और बाद वाला बाध्य है) – yapkm01

उत्तर

1

के लिए कच्चे assiging मैं सही ढंग से सोच रहा हूँ तो नहीं दिख रहा है, तो डिफ़ॉल्ट रूप से संकलक मान लिया गया है तो आप इस

List<?> list = new ArrayList(); 

मतलब है? इसका मतलब है कि आप चाहते हैं कि कोई सामान्य प्रकार हो। यही कारण है कि

List list = new ArrayList(); 
List <?> list2 = list 

काम करता है, क्योंकि संकलक के लिए वे एक ही बात

हालांकि, कर रहे हैं जब आप इस

List<?> list = new ArrayList(); 
List<? extends Object> list2 = list 

कर आप अपने दायरे को सीमित कर रहे हैं। क्योंकि आप दायरे को सीमित कर रहे हैं, आपको एक चेतावनी मिलती है। हां, मुझे पता है कि आप नहीं सोचते कि आप हैं, लेकिन संकलक के लिए आप हैं।यदि आप पूरी तरह से सुनिश्चित हैं कि आप जानते हैं कि आप क्या कर रहे हैं, तो इसे अनदेखा करें या इसे

0

मान लें कि अगर हम Object की बजाय सूचीका उपयोग करते हैं। यह ठीक संकलन है, लेकिन रनटाइम त्रुटि:

List list = new ArrayList(); 
list.add("a"); 
List <? extends Runnable> list1 = list; 
for(Runnable o:list1){ //Runtime exception-> java.lang.ClassCastException 
    o.run(); 
} 

मामले संभावित समस्या पता चलता है, यही कारण है कि यहां की चेतावनी।

लेकिन आपका आईडीई सिर्फ सिंटैक्स List <? extends SomeType> की जांच करता है, इससे कोई फर्क नहीं पड़ता कि कुछ टाइप Object या कुछ और है।

0

मुझे विश्वास है कि ऐसा होता है क्योंकि जावा उस बाउंड वाइल्डकार्ड को संभालने के तरीके के कारण होता है, उस सूची < में? ऑब्जेक्ट > विस्तारित नहीं है और न ही सूची

मूल रूप से अवधारणा मुझे कुछ हद तक भ्रमित करने वाला अवधारणा है, और मुझे Generics in the Java Programming Language दस्तावेज़ विशेष रूप से इन प्रकार के जेनेरिकों को समझने में बेहद उपयोगी पाया गया है।

+0

आप कुछ स्वरूपण खो रहे हैं, मुझे लगता है ... –

0

मुझे लगता है कि शेनगुआनल लू ने इसे पहले ही समझाया है। मैं जोड़ना होगा कि जब भी आप ऐसी बात को देखने के लिए, बस इन दो निम्नलिखित बातों को याद:

  1. तुम बस "घिरे प्रकार" के एक कंटेनर के लिए "किसी भी प्रकार" का एक कंटेनर डाली नहीं कर सकते हैं (कोई बात नहीं करता है, तो पूर्व ऑब्जेक्ट प्रकार से जुड़ा हुआ है)।
  2. जब भी आप यह करते हैं, आप "ढेर प्रदूषण" बनाने
2

This question, और विशेष रूप this answer में, ? और ? extends Object के बीच मतभेद पर कुछ और जानकारी है (करने के लिए एंजेलिका लैंगर के जावा जेनेरिक्स पूछे जाने वाले प्रश्न के वर्णन के लिए देखें)। मुझे अभी भी कुछ भी नहीं मिला है जो कहता है कि आपको List से List<? extends Object> पर चेतावनी क्यों दी जाती है।

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