2011-11-30 8 views
22

क्या क्लास या इंटरफेसबी को स्वीकार करने वाली विधि को सामान्य रूप से पैरामीटर करना संभव है?जेनेरिक या इसके बजाय <टी संख्या बढ़ाता है CharSequence>

के कारण संकलित नहीं है | स्यूडोकोड

public <T extends Number | CharSequence> void orDoer(T someData){ // ... } 

यानी बजाय कई विधि हस्ताक्षर लिखने की, मैं इस एक विधि एक तर्क

एक नंबर या CharSequence तर्क

साथ पास करना चाहिए के रूप में या तो एक नंबर या CharSequence स्वीकार करना चाहते हैं
orDoer(new Integer(6)); 
int somePrimitive = 4; 
orDoer(somePrimitive); 
orDoer("a string of chars"); 
+4

क्या आपको लगता है कि विधि है कि दो अलग-अलग तरीकों कि स्वीकार 'Number' या के साथ नहीं किया जा सकता अंदर करना होगा' CharSequence' क्रमशः और फिर काम करने के लिए एक तिहाई, निजी विधि प्रतिनिधि? –

+1

मैं मानता हूं कि यदि लाभ दो प्रकार से निपट रहा है, तो लाभ असंतुलित है, लेकिन यह अधिक पैरामीटर प्रकारों को प्रस्तुत करने का एक अच्छा संक्षिप्त तरीका प्रतीत होता है (जो उपयोग करने योग्य सुपरटेप साझा नहीं करते हैं) – Cel

+1

आपको [सेयलॉन] (http: // ceylon-lang.org/documentation/1.1/introduction/) संघ प्रकार। ;) – Anonsage

उत्तर

16

यदि आप वास्तव में ऐसा करना चाहते हैं, तो आपको यो के कस्टम वर्ग के अंदर स्वीकृत कक्षाएं लपेटनी होगी आप स्वयं अपने उदाहरण मामले में, शायद कुछ की तरह:

public class OrDoerElement { 
    private final Number numberValue; 
    private final CharSequence charSequenceValue; 

    private OrDoerElement(Number number, CharSequence charSequence) { 
     this.numberValue = number; 
     this.charSequenceValue = charSequence; 
    } 

    public static OrDoerElement fromCharSequence(CharSequence value) { 
     return new OrDoerElement(null, value); 
    } 

    public static OrDoerElement fromNumber(Number value) { 
     return new OrDoerElement(value, null); 
    } 
} 

और अपने orDoer विधि हो जाता है:

public void orDoer(OrDoerElement someData) { .... } 

तो फिर तुम उन में से एक का निर्माण और उपयोग कर अपने विधि में उपयोग कर सकते हैं:

orDoer(OrDoerElement.fromCharSequence("a string of chars")); 
orDoer(OrDoerElement.fromNumber(new Integer(6))); 

लेकिन ईमानदारी से, यह थोड़ा पैरामीटर प्रकारों के साथ एक विधि को कॉल करने में सक्षम होने के लिए थोड़ा जटिल और बहुत अधिक काम लगता है। क्या आप वाकई दो तरीकों का उपयोग करके और सामान्य तर्क के लिए तीसरी विधि का उपयोग करके इसे प्राप्त नहीं कर सकते हैं?

+0

उत्तर के लिए धन्यवाद! मुझे एहसास हुआ कि मैंने अपने उपयोग-मामले को सही तरीके से समझाया नहीं है - मैं क्लास ए को विस्तारित करने के समान कुछ ढूंढ रहा था इंटरफ़ेसबी' क्योंकि मैं चाहता था कि मेरी विधि का कॉलर अपने प्रकार के रूप में पास हो सके (इंटीजर या स्ट्रिंग इत्यादि)। यही है, 'स्टोर (टी डेटा)' विधि प्रदान करने के लिए, जो सभी प्रकार के प्रकारों को स्वीकार करेगा, जिसमें .toString() और एक मानक सिंगल-पैरामीटर इंस्टेंटेशन (संख्या, charSequence, दिनांक और) से पूरी तरह से पुन: निर्माण करने की विशेषता है। कई और लगातार प्रकार)। – Cel

+0

यानी मैं एक और तरीका पूछ सकता था कि सवाल नहीं है - ऑब्जेक्ट से पहले - संख्या, CharSequence और अन्य मूल प्रकारों के लिए, जो उन्हें उन यूनिकॉनस्ट्रक्टेबल के रूप में चिह्नित करेगा या जिन्हें आप उन्हें कॉल करना चाहते हैं .. (उम्मीद है कि समझ में आता है) – Cel

+0

हाँ, मैं समझता हूं, इस तरह की सुपर-सुपर क्लास वास्तव में कुछ मामलों में उपयोगी साबित होगी – Guillaume

1

क्या आपके लिए एक अज्ञात सार कक्षा का उपयोग कर रहा है? जब मुझे सुरक्षित पैरामीटर या रिटर्न प्रकारों की आवश्यकता होती है, तो मैं नीचे दिए गए कोड के कुछ प्रकार का उपयोग करता हूं। ऐसा कहा जा रहा है कि, मैं यहां अन्य टिप्पणियों से सहमत हूं, और उत्सुक हूं कि आप वास्तव में क्या लाभ उठाते हैं जब आप उन वस्तुओं के समूह के लिए एक प्रकार की सुरक्षा लागू कर रहे हैं जिनके पास आम बात नहीं है।

public abstract class Doer<T> { 

    public void do(T obj) { 
    // do some stuff. 
    } 

} 

// calling method 

new Doer<Number>(){}.do(new Integer(5)); 
+1

धन्यवाद, कृपया गिलाउम के पोस्ट के तहत स्पष्टीकरण देखें। – Cel

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