2009-09-04 14 views
11

के साथ जावा में वैकल्पिक पैरामीट्रिजेशन क्या कक्षा में parametrzing जब डिफ़ॉल्ट प्रकार निर्दिष्ट करना संभव है? उदाहरण:जेनिक्स

// abstract class  
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class> { 
     // code 
    } 


// parametrized imlementation class 
public class RealClass extends AbsClass<ClassThatExtendsPar1, ClassThatExtendsPar2Class> { 
    // code 
} 

// non-parametrized imlementation class 
public class RealClass extends AbsClass { 
    // code 
} 
मेरी कार्यान्वयन में

मैं कोई भी या सभी पैरामीटर निर्दिष्ट करने के लिए है।

// abstract class  
public abstract class AbsClass<T1 extends Par1Class, T2 extends Par2Class : default Par2Class > { 
     // code 
    } 

// parametrized only mandatory imlementation class 
public class RealClass extends AbsClass<ClassThatExtendsPar1> { 
    // code 
} 

उत्तर

18

सरल जवाब: नहीं, जावा ऐसा डिफ़ॉल्ट parametrizations का समर्थन नहीं करता दूसरा पैरामीटर गैर अनिवार्य कुछ इस तरह बनाने के लिए, संभव है।

1

ऐसा करने का वास्तव में कोई अच्छा कारण नहीं है। आम तौर पर आप सामान्य प्रकार पैरामीटर निर्दिष्ट करते हैं क्योंकि कुछ विधि तर्क उस प्रकार के पैरामीटर को लेते हैं या वापस करते हैं। यदि निर्दिष्ट नहीं किया गया था, तो ऐसा लगता है कि आप उन विधियों के किसी भी सार्थक कार्यान्वयन को न करने का इरादा रखते हैं।

वैसे भी, अपनी कथित समस्या को हल करने के लिए, किसी भी प्रकार के पैरामीटर के लिए बस "ऑब्जेक्ट" निर्दिष्ट करें जिसे आप निर्दिष्ट करने की परवाह नहीं करते हैं। या अमूर्त वर्ग को एक और अमूर्त वर्ग के साथ बढ़ाएं जिसमें केवल एक प्रकार का पैरामीटर हो (ऑब्जेक्ट को आपके विस्तार कॉल में दूसरे प्रकार के पैरामीटर के रूप में निर्दिष्ट करें)।

+1

वहाँ ऐसा करने का एक अच्छा कारण है हो सकता है। क्योंकि मेरा "वैकल्पिक पैरामीटर" (टी 2 Par2Class बढ़ाता है) एक वर्ग है जिसे हम वैल्यू ऑब्जेक्ट के रूप में उपयोग करते हैं और कई अन्य वर्गों में विस्तारित होते हैं। अगर मैं टी 2 निर्दिष्ट नहीं करता हूं, तो मैं ValueObject से डिफ़ॉल्ट विधियों का उपयोग करता हूं। अगर मैं निर्दिष्ट करता हूं, तो मुझे विशिष्ट तरीकों की आवश्यकता है और उन्हें कास्ट करने की ज़रूरत नहीं है। मैं विरासत आदेश में एक और कक्षा शुरू करने की सोच रहा था, लेकिन मैं वैकल्पिक parametrization के बारे में उत्सुक था। धन्यवाद। – davorp

+0

मैं गलत हो सकता हूं, लेकिन मुझे लगता है कि ऐसे उपयोग के मामले हैं। सी ++ में, जहां डिफॉल्ट टेम्पलेट प्रकारों की अनुमति है, उनका उपयोग किया जाता है उदा। एसटीएल प्रकारों के लिए मेमोरी आवंटक का एक डिफ़ॉल्ट संस्करण प्रदान करने के लिए। – Rom1

+0

इसके लिए विशिष्ट अच्छा उपयोग स्विंगवर्कर के इंटरमीडिएट प्रकार पैरामीटर होगा, यदि यह परिणामी पैरामीटर के समान है। –

0

ठीक है, आपके मामले के लिए सही समाधान

// parametrized only mandatory imlementation class 
public class RealClass<StillGeneric extends Par1Class> 
extends AbsClass<ClassThatExtendsPar1, StillGeneric> { 
    // code 
} 
देखने की मेरी बात से
+0

लेकिन मुझे AbsClass से "parametrized" विधियों की आवश्यकता है। यदि मैं रीयल क्लास को पैरामीट्रिज करता हूं, तो मेरे मामले में इसका कोई उपयोग नहीं होता है। या मैं कुछ गलत कर रहा हूँ? – davorp

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