आप एक सामान्य विधि घोषित, तो आप हमेशा फोन करने वाले निर्णय लेते हैं, किस प्रकार का तर्क प्रकार पैरामीटर के लिए उपयोग करने के लिए करते हैं। विधि का कार्यान्वयन सभी संभावित प्रकार के तर्कों से निपटने में सक्षम होना चाहिए (और इसमें वास्तविक प्रकार के तर्कों के बारे में पूछने का कोई तरीका भी नहीं है)।
कहा कि, <T> void fly(T obj);
की तरह एक विधि कहा गया है कि फोन करने वाले T
के लिए किसी भी प्रकार का उपयोग कर सकते हैं, जबकि केवल एक चीज कार्यान्वयन पर भरोसा कर सकते कि T
के लिए वास्तविक प्रकार Object
को आबंटित किया जाएगा (जैसे <T extends Object>
घोषित कर दिया गया था, तो) ।
तो इस विशिष्ट उदाहरण में, यह की घोषणा से अलग नहीं है, जो मनमानी वस्तुओं को भी अनुमति देता है।
इसके विपरीत, एक interface
पर एक प्रकार पैरामीटर अनुबंध का हिस्सा है और निर्दिष्ट या प्रतिबंधित किया जा सकता एक कार्यान्वयनinterface
के द्वारा:
public interface Flight<T>{
void fly(T obj);
}
public class X implements Flight<String> {
public void fly(String obj) {
}
}
तरह कार्यान्वयन की अनुमति देता है
कार्यान्वयन पक्ष पर T
के प्रकार को ठीक करना। या
public class NumberFlight<N extends Number> implements Flight<N> {
public void fly(N obj) {
}
}
अभी भी सामान्य किया जा रहा है लेकिन प्रकार सीमित।
एक interface
के हस्ताक्षर भी महत्वपूर्ण है जब interface
ही किसी अन्य विधि का हस्ताक्षर है, उदा का एक हिस्सा है
public void foo(Flight<? super String> f) {
f.fly("some string value");
}
यहाँ, Flight
कार्यान्वयन, जो आप foo
के पास, एक String
मूल्य लेने वाली है, इसलिए Flight<String>
या Flight<CharSequence>
या Flight<Object>
पर्याप्त हैं, लेकिन नहीं Flight<Integer>
करने में सक्षम होना चाहिए। ऐसे अनुबंध को घोषित करने के लिए interface
पर टाइप पैरामीटर की आवश्यकता है, interface
के तरीकों पर नहीं।
क्या आप एक insatnce को लागू 'flight' सक्षम होना चाहते हैं 'फ्लाई' विधि में केवल एक चयनित प्रकार का डेटा या किसी भी प्रकार का डेटा संभालने के लिए? – Pshemo