2012-02-04 23 views
21

दोनों में से किसी को स्वीकार करता है मैं इस फॉर्म की एक सामान्य वर्ग बनाना चाहते हैं। तो केवल दो स्वीकार्य घोषणाएं होंगी:जेनेरिक वर्ग कि दो प्रकार के

MyGenericClass<Integer> instance; 
MyGenericClass<Long> instance; 

क्या ऐसा करने का कोई तरीका है?

उत्तर

22

उत्तर नहीं है। कम से कम सामान्य प्रकारों का उपयोग करने का कोई तरीका नहीं है। मैं जो भी चाहता हूं उसे करने के लिए जेनेरिक और फैक्ट्री विधियों के संयोजन की सिफारिश करता हूं।

class MyGenericClass<T extends Number> { 
    public static MyGenericClass<Long> newInstance(Long value) { 
    return new MyGenericClass<Long>(value); 
    } 

    public static MyGenericClass<Integer> newInstance(Integer value) { 
    return new MyGenericClass<Integer>(value); 
    } 

    // hide constructor so you have to use factory methods 
    private MyGenericClass(T value) { 
    // implement the constructor 
    } 
    // ... implement the class 
    public void frob(T number) { 
    // do something with T 
    } 
} 

यह सुनिश्चित करता है कि केवल MyGenericClass<Integer> और MyGenericClass<Long> उदाहरणों बनाया जा सकता है। यद्यपि आप अभी भी MyGenericClass<Double> प्रकार का एक चर घोषित कर सकते हैं, यह सिर्फ शून्य होना होगा।

+0

तब जेनेरिक का उपयोग करने का लाभ कहां है? टाइप टी के पैरामीटर वाले विधि बनाने के बाद से कोई भी नंबर स्वीकार करेगा? –

+0

अपने कोड में, यह निश्चित रूप से नहीं है। चूंकि टाइप टी के पैरा को स्वीकार करने की विधि लिख नहीं सकती है। आपको प्रत्येक ऐसी विधि की दो अलग-अलग परिभाषाएं लिखनी होंगी, एक इंटीजर के लिए और दूसरा लांग के लिए। –

+0

@djaqeel यह सच नहीं है। यदि आप लंबे या पूर्णांक के अलावा किसी अन्य चीज़ के साथ फ्रोब विधि का उपयोग करने का प्रयास करते हैं तो आपको एक कंपाइलर अपवाद मिलेगा। – luke

2

नहीं, जावा जेनिक्स में इसकी अनुमति देने के लिए कुछ भी नहीं है। आप FooIntegerImpl और FooLongImpl द्वारा कार्यान्वित एक गैर-सामान्य इंटरफ़ेस रखने पर विचार करना चाहेंगे। आप जो हासिल करने की कोशिश कर रहे हैं उसके बारे में अधिक जानने के बिना कहना मुश्किल है।

+0

मैंने इसके बारे में सोचा, और यह मेरी समस्या का समाधान करेगा। मैं बस सोच रहा था कि क्या जावा जेनेरिक ने मुझे इस कक्षा घोषित किए बिना ऐसा करने की अनुमति दी है। लेकिन मैं इंटरफेस का उपयोग नहीं करूंगा, क्योंकि दोनों वर्गों के कार्यान्वयन समान हैं। मैं एक अमूर्त पैकेज संरक्षित वर्ग बनाउंगा और इसे विस्तारित करने वाले दो सार्वजनिक वर्ग बनाएगा। – Rafael

+0

और जो मैं प्राप्त करने की कोशिश कर रहा हूं, उसके लिए मैं एक वर्ग बनाना चाहता हूं जो इंटीजर, लांग या किसी अन्य इंट-जैसे प्रकार के लिए समझ में आता है, लेकिन फ्लोटिंग पॉइंट प्रकारों के साथ इसका उपयोग करने के लिए यह समझ में नहीं आता है। – Rafael

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