वापसी प्रकार वर्ग है कि इंटरफ़ेस को लागू करता है के प्रकार होना चाहिए, तो क्या आप चाहते हैं कहा जाता है एक F-bounded type:
public interface A<T extends A<T>>{ public T b(); }
public class C implements A<C>{
public C b() { ... }
}
public class D implements A<D>{
public D b() { ... }
}
शब्दों में, A
एक प्रकार पैरामीटर T
उस पर ले जाएगा की घोषणा कर रहा है प्रत्येक ठोस प्रकार का मान जो A
लागू करता है। यह आमतौर पर clone()
या copy()
जैसी चीजों को घोषित करने के लिए उपयोग किया जाता है जो अच्छी तरह से टाइप किए जाते हैं। एक और उदाहरण के रूप में, यह घोषणा करने के लिए java.lang.Enum
द्वारा उपयोग किया जाता है कि प्रत्येक enum विरासत में compareTo(E)
विधि केवल उस विशेष प्रकार के अन्य enums पर लागू होती है।
यदि आप अक्सर इस पैटर्न का उपयोग करते हैं, तो आप this
T
टाइप करने के लिए परिदृश्य में भाग लेंगे। पहली नज़र में यह स्पष्ट प्रतीत हो सकता है कि यह है, लेकिन आपको वास्तव में abstract T getThis()
विधि घोषित करने की आवश्यकता होगी, जिसे कार्यान्वयनकर्ताओं को return this
के रूप में छोटे पैमाने पर कार्यान्वित करना होगा।
[1] जैसा कि टिप्पणीकारों ने इंगित किया है, X implements A<Y>
जैसे X
और Y
ठीक से सहयोग करने के लिए कुछ स्नीकी करना संभव है। T getThis()
विधि की उपस्थिति यह भी स्पष्ट करती है कि X
A
इंटरफ़ेस के लेखक के इरादे को बाधित कर रहा है।
स्रोत
2010-03-10 01:18:49
+! - बहुत अच्छा। मैंने यहाँ कुछ सीखा। धन्यवाद, मैट। – duffymo
ऑफ-विषय: इस तरह वाक्यविन्यास यही कारण है कि मैं जितना संभव हो सके जेनरेटेड एपीआई बनाने से बचने के लिए अपना सर्वश्रेष्ठ प्रयास कर रहा हूं। – dimitarvp
अच्छा उत्तर (और जेनेरिक की शक्ति का एक बड़ा उदाहरण), लेकिन यह प्रोग्रामर को सी लागू करने से रोकता नहीं है (मेरा दूसरा जवाब देखें)। –
Cam