2013-01-15 11 views
8

संभव डुप्लिकेट:
What’s the difference between <?> and <? extends Object> in Java Generics?सूची <?> बनाम सूची <? फैली हुई वस्तु>

मैंने पाया कि List<?> और उसी तरह से List<? extends Object> काम करते हैं। मेरे लिए, उनके बीच कोई अंतर नहीं है। अगर मैं सही नहीं हूं, तो क्या आप मुझे अंतर बता सकते हैं?

import java.util.ArrayList; 
import java.util.List; 

public class TestClass { 

static void func1(List<?> o, Object s) { 
    o.add(null); // only null 
    o.add(s); // wrong 
    o.get(0); // OK 
} 

static void func2(List<? extends Object> o, Object s) { 
    o.add(null); // only null 
    o.add(s); // wrong 
    o.get(0); // OK 
} 

public static void main(String[] args) { 
    func1(new ArrayList<String>(), new Integer(1)); 
    func2(new ArrayList<String>(), new Integer(1)); 

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

    List<? extends Object> list3 = new ArrayList<String>(); 
    List<?> list4 = new ArrayList<String>(); 
} 
} 
+5

कोई फर्क नहीं पड़ता। 'ऑब्जेक्ट बढ़ाता है' अनावश्यक है और अन्यथा माना जाता है, जैसे 'कक्षा एफ ऑब्जेक्ट बढ़ाता है'। –

+1

मैं शर्त लगाता हूं कि वे समकक्ष हैं, क्योंकि जावा में सभी वर्गों ने स्पष्ट रूप से 'ऑब्जेक्ट' का विस्तार किया है। – murgatroid99

+1

कोई फर्क नहीं पड़ता, यह भाषा डिजाइन/व्याकरण का परिणाम है। – nullpotent

उत्तर

1

दोनों समान हैं क्योंकि जावा में सभी ऑब्जेक्ट Object का विस्तार करते हैं। मैं List<?> पसंद करूंगा क्योंकि यह अधिक संक्षिप्त है।

1

प्रत्येक वर्ग List<? extends Object> के लिए MyClass extends Object के समान List<?> जैसा ही है।

0

हालांकि मैं मार्को को चोरी कर रहा हूं, जिसके लिए मैं क्षमा चाहता हूं, उसकी टिप्पणी सही जवाब है।

कोई अंतर नहीं है, क्योंकि प्रत्येक प्रकार extends Object स्पष्ट रूप से कोई अंतर नहीं है।

9

यह जटिल है ...

किसी भी प्रकार के चर T के लिए, कल्पना का कहना है http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4

हर प्रकार चर ... एक बाध्य है। यदि किसी प्रकार के चर के लिए कोई बाध्य घोषित नहीं किया गया है, तो वस्तु ग्रहण की जाती है।

एक सोच सकता है कि यह भी वाइल्डकार्ड के लिए सच है, और ? सिर्फ ? extends Object के लिए एक आशुलिपि होना चाहिए।

फिर भी spec के माध्यम से खोज, इस बात का कोई सबूत नहीं है कि वाइल्डकार्ड में ऊपरी बाउंड (या निचला बाध्य) होना चाहिए। "Unbounded" ? बाध्य वाइल्डकार्ड से लगातार स्पष्ट रूप से इलाज किया जाता है।

हम subtyping नियम से निकालना सकता है, कि List<?> और List<? extends Object>, एक दूसरे को अर्थात के उपप्रकार होते हैं, वे मूल रूप से एक ही प्रकार के कर रहे हैं। (कटौती तथ्य यह है कि interface List<E> में E एक अंतर्निहित ऊपरी बाध्य Object है पर निर्भर करता है, लेकिन नियमों को वाइल्डकार्ड पर सीमा की आवश्यकता नहीं है)

फिर भी कल्पना दो अलग ढंग से व्यवहार करता है। उदाहरण के लिए http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7List<?> एक reifiable प्रकार है, लेकिन List<? extends Object> जिसका अर्थ है

// ok 
    List<?>[] xx = {}; 
    // fail 
    List<? extends Object>[] yy = {}; 

    // ok 
    boolean b1 = (y instanceof List<?>); 
    // fail 
    boolean b2 = (y instanceof List<? extends Object>); 

मैं क्यों हालांकि समझ में नहीं आता नहीं है,। ऐसा लगता है कि वाइल्डकार्ड में ऊपरी बाउंड और निचली बाउंड होना चाहिए, Object और null type पर डिफ़ॉल्ट होना चाहिए।

+0

लेकिन, यह एक सामान्य प्रकार की घोषणा G दिया गया है, जी लगभग कुछ एक्स <: B. G के समान है। '4.5.1 के तहत। – nullpotent

+0

@iccthedral - 'सूची' मामले पर लागू, 'सूची कुछ एक्स <: ऑब्जेक्ट' – irreputable

+1

ठीक है, हाँ के लिए सूची सूची के समान है। यही मेरा सवाल है। 'एक्स <: बी' चाहिए (?) एक समावेशी उप प्रकार संबंध होना चाहिए, हालांकि मुझे इसके लिए संदर्भ नहीं मिल रहा है। यह ठीक है क्योंकि टी टी विस्तारित सी भी समावेशी है। – nullpotent