2015-12-23 7 views
6

मैं वर्तमान में जावा जेनरिक पढ़ रहा हूं, और जब वाइल्डकार्ड की बात आती है तो मैं थोड़ा फंस गया हूं।जावा जेनरिक - कक्षा एक सबक्लास स्वयं?

मैं संग्रह वर्ग से इस विधि दी गई है:

public void <T> copy(List<? super T> dest, List<? extends T> src) { 
    for(int i = 0; i < src.size(); i++) { 
     dest.set(i, src.get(i)); 
    } 
} 

मैं तो बताया गया है कि इसे इस तरह विधि कॉल करने के लिए संभव है: प्रकार पैरामीटर है के रूप में

List<Object> objs = new ArrayList<Object>(); 
List<Integer> ints = new ArrayList<Integer>(); 
Collections.copy(objs, ints); 

यह निर्धारित करने के लिए कंपाइलर को छोड़ दिया गया है, पुस्तक कहती है कि कंपाइलर टाइप पैरामीटर को इंटीजर के रूप में चुनता है।

लेकिन यह कैसे संभव है?

यदि यह पूर्णांक होना करने के लिए ले जाया गया, इसका मतलब यह होगा कि विधि घोषणा में -
List<? extends T>List<Integer extends Integer> लिए अनुवाद होगा।

क्या यह एक गलती है, या जेनेरिक के संबंध में अलग-अलग नियम हैं? मैंने चारों ओर गुगल किया है और अधिकांश परिणामों का कहना है कि एक वर्ग स्वयं का उप-वर्ग नहीं हो सकता है।

+0

निजेट का उत्तर बिल्कुल सही है और यदि आप उस बिंदु को याद कर रहे थे तो उसने समझाया कि यह सब अच्छा है। हालांकि, जेनेरिक बहुत ही भ्रमित हो सकता है और यदि आपको लगता है कि आपको इस विशिष्ट मामले पर अधिक व्यापक स्पष्टीकरण की आवश्यकता है तो मैं एक देने का प्रयास कर सकता हूं। – user1803551

उत्तर

8

नहीं, यह कोई त्रुटि नहीं है।

? extends Integer का अर्थ है: किसी भी वर्ग जो इंटीजर (या पूर्णांक लागू करता है, अगर इंटीजर इंटरफ़ेस था) लागू करता है।

यह ? super Integer के लिए जाता है, जिसका अर्थ है: किसी भी वर्ग जो इंटीजर है या एक सुपरक्लास या इंटीजर का सुपर-इंटरफेस है।

+0

इसे साफ़ करने के लिए धन्यवाद। विकल्प उपलब्ध होने पर उत्तर स्वीकार करेगा। – user3650602

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