2012-08-26 33 views
5

में पैरामीटरेटेड विधियां मेरे पास एक आसान सवाल है। हालांकि मुझे खोज करके कोई जवाब नहीं मिल रहा है।जेनेरिक क्लास प्रकार

क्या इन दो कोड-टुकड़ों में कोई अंतर है? और क्या अंतर है?

Fragment1:

public class BinaryTree<T extends Comparable<? super T>> { 
    ... 
    public <E extends T> void add(E value) { 
     ... 
    } 

    public <E extends T> void add(E value, Node node) { 
     ... 
    } 
    ... 
} 

Fragment2:

public class BinaryTree<T extends Comparable<? super T>> { 
    ... 
    public void add(T value) { 
     ... 
    } 

    public void add(T value, Node node) { 
     ... 
    } 
    ... 
} 

Fragment1 स्पष्ट रूप से निर्दिष्ट करता है, उस पैरामीटर मूल्य प्रकार टी या प्रकार टी की एक उप-प्रकार के दोनों होना चाहिए।

Fragment2 निर्दिष्ट करता है, उस पैरामीटर मूल्य प्रकार टी का होना चाहिए। लेकिन मेरे छोटे ज्ञान और अनुभव से मुझे लगता है कि मैं टी का उप-प्रकार भी प्रदान कर सकता हूं। खंड 1 के समान ही।

मैंने इन दो टुकड़ों के अलग-अलग बाइट कोडों को देखा।

< public <E extends T> void add(E); 
--- 
> public void add(T); 

कि सिर्फ स्रोत कोड को दर्शाता है ...

मैं सिर्फ अर्थ नहीं मिलता है: वास्तव में वहाँ एक अंतर है। और मुझे एक उदाहरण एप्लिकेशन भी नहीं मिल रहा है, जो अंतर दिखाता है।

टिप्पणियों के लिए धन्यवाद।

+0

ये टुकड़े कहाँ से आए थे? क्या यह होमवर्क/coursework है? – Bobulous

+0

टुकड़े एक किताब बनाते हैं। लेखक खंड 2 से खंड 1 तक जाने के द्वारा कक्षा में सुधार करने का दावा कर रहा है। मैं उनकी व्याख्याओं का पुनर्निर्माण करने में सक्षम नहीं था। – Bridy

उत्तर

4

इस मामले में कोई फर्क नहीं पड़ता। के उदाहरण के लिए एक BinaryTree<Number> लेने के लिए और एक Integer जोड़ने की कोशिश करते हैं:

BinaryTree<Number> numTree = new BinaryTree<>(); 
Integer i = 1; 
numTree.add(i); 
टुकड़ा 1 के साथ

, EInteger का मूल्यांकन कर सकते हैं, लेकिन यह है कि इस मामले में ज़रूरत से ज़्यादा है। IntegerएकNumber है, और आप बस के रूप में अच्छी तरह से E के लिए Number निर्दिष्ट कर सकते हैं:

numTree.<Number>add(i); 

इस कारण से दूसरा टुकड़ा पहले से अलग नहीं है, और एक अनावश्यक प्रकार पैरामीटर की घोषणा नहीं करने के लिए कम भ्रामक है।


ऐसी स्थितियां हैं जहां एक अतिरिक्त प्रकार पैरामीटर उपयोगी होगा। कल्पना कीजिए कि किसी कारण से आप मूल्य में पारित वापस जाने के लिए चाहता था:

public <E extends T> E add(E value) { 
    ... 
    return value; 
} 

public <E extends T> E add(E value, Node node) { 
    ... 
    return value; 
} 

यह अब फोन करने वाले के लिए उपयोगी हो जाएगा:

Integer i2 = numTree.add(i); 
दूसरा टुकड़ा है कि संभव नहीं होगा के साथ

, और numTree.add सकता है यदि आप Integer में पास हुए हैं तो भी केवल Number लौटाएं।

1

नहीं, add() विधि के दो भिन्नताओं के बीच कोई अंतर नहीं है।जावा के विधि तर्क पहले से स्वीकृत प्रकार पर ऊपरी बाउंड स्थापित करते हैं, जो आपके प्रकार परिवर्तनीय <E extends T> के extends फ़ॉर्म का उपयोग करके पूरा किया गया एक ही बाधा है।

आपके प्रकार परिवर्तनीय कोई नई जानकारी नहीं जोड़ता है और न ही यह कोई अतिरिक्त बाधा डालता है। Tया T तक फैले किसी भी प्रकार का तर्क पारित करने के लिए पहले से ही कानूनी था। आपके प्रकार परिवर्तनीय <E extends T> वास्तविक तर्क प्रकार को फिर से संदर्भित करने का एक तरीका प्रदान करते हैं — कहें, यदि कोई दूसरा तरीका पैरामीटर था जिसे आप सुनिश्चित करना चाहते थे कि पहले — जैसा ही होगा, लेकिन आपके मामले में, आप नहीं बना रहे हैं E का उपयोग।

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