2013-01-07 12 views
5

कैसे सीमित कर सकते हैं मैं निम्नलिखित कोड है:मैं जावा जेनेरिक्स

protected <T> T getValueForKey(String key) { 

    T value = null; 

    // currentStats is just a Bundle 
    if (currentStats.containsKey(key)) { 
     return value; 
    } 
    return value; 
} 

मैं कैसे प्रतिबंध सेट कर सकते हैं? अर्थात। उदाहरण के लिए टी स्ट्रिंग या int या डबल होना चाहिए। क्या यह संभव है?

पीएस

मैं का उपयोग नहीं करना चाहते हैं

protected <T extends String> T getValueForKey(String key) { 

} 

क्योंकि मैं केवल स्ट्रिंग्स के लिए नहीं करना चाहते हैं ..

+2

नोट: '<टी स्ट्रिंग> == ' बढ़ाता है क्योंकि स्ट्रिंग अंतिम है। – assylias

+1

संरक्षित टी getValueForKey (स्ट्रिंग कुंजी, कक्षा परिणाम क्लास) .. getValue कॉल करते समय रिटर्न प्रकार सेट करें ... – anfy2002us

+1

यदि आप इनपुट मान को प्रतिबंधित कर रहे थे, तो आप केवल दो अलग ओवरलोड का उपयोग कर सकते हैं, लेकिन यदि आप ' आउटपुट को सीमित कर रहे हैं। –

उत्तर

6

जब से तुम वापसी मान मैं अलग एक्सेसर तरीकों के लिए सुझाव है कि ओवरलोड नहीं कर सकते हैं:

protected int  getIntForKey(String key); 
protected double getDoubleForKey(String key); 
protected String getStringForKey(String key); 
2

मुझे लगता है कि वहाँ केवल स्ट्रिंग के लिए एक क्रियाशील प्रकार को प्रतिबंधित करने के लिए एक रास्ता है न, इंटीजर और डबल, लेकिन आप <T extends Comparable> स्ट्रिंग, इंटीजर और डबल के रूप में सभी कार्यान्वयन योग्य लागू कर सकते हैं। लेकिन कई अन्य वर्ग की भी java.util.Date की तरह तुलनीय लागू,

+0

यह कई अन्य प्रकारों (उदाहरण के लिए दिनांक) की अनुमति भी देगा। मुझे नहीं लगता कि यह पूछा जा रहा है। – assylias

+0

@assylias सच है, लेकिन क्या आपको लगता है कि जेनेरिक का उपयोग करके इसके अलावा कोई अन्य दृष्टिकोण है ?? – PermGenError

+0

नहीं, मुझे नहीं लगता कि वहां है, जो एक और उचित उत्तर होगा ;-) – assylias

1
protected <T extends Object> T getValueForKey(String key); 

मैं वैसे भी की नहीं जानते कि तुम लौट सकते हैं "एक स्ट्रिंग या एक पूर्णांक या एक डबल" आदि

आप कर सकते थे ऑब्जेक्ट के क्लास नाम को वापस करने के लिए हमेशा कुछ तर्क जोड़ें और ऑब्जेक्ट लौटाए गए अपवाद को फेंक दें, वांछित प्रकारों में से एक नहीं है।

+0

क्या इस दृष्टिकोण का खतरा नहीं है कि आप प्रकार की सुरक्षा खो देते हैं? –

+0

टी का उपयोग करने के लिए अद्यतन किया गया ऑब्जेक्ट – cowls

0

यह करने के लिए कोई सीधा तरीका नहीं है।
टाइप T के लिए उपयोग की जाने वाली कक्षाओं में प्रतिबंधित होने के लिए कुछ सामान्य होना चाहिए, आईई। कक्षाएं कि T सब कुछ इंटरफ़ेस को लागू करने के लिए है - यह मान है InterfaceName

तो वर्ग className वर्ग कि protected T getValueForKey(String key) होता है, आप तो इस प्रकार वर्ग ClassName घोषित करने के लिए है:

class ClassName<T extends InterfaceName> 

एक बहुत समान प्रश्न पहले से ही इस URL पर कहा गया था:

How to restrict types which are allowed as "T" in a generic class?

+0

बढ़ाता है क्या आप अधिक विशिष्ट हो सकते हैं? –

+0

प्रतिबंध लगाने के लिए टी प्रकारों को आम तौर पर कुछ इंटरफ़ेस को लागू करना होगा - क्या कोई ऐसा इंटरफ़ेस है जिसे वे सभी लागू करते हैं? (आप यह भी आवश्यकता कर सकते हैं कि टी अल्पविराम से अलग सूची का उपयोग करके कई इंटरफेस लागू करता है) –

0

@ anfy2002us की टिप्पणी गूंज - यदि यह सीए के लिए ठीक है दिए गए कुंजी से जुड़े मूल्य के वांछित प्रकार को जानने के लिए, इस बारे में कैसे?

protected <T> T getValueForKey(String key, Class<T> type) { 
    return currentStats.containsKey(key) ? type.cast(currentStats.get(key)) : null; 
} 

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

  • कोई संबंधित समस्या नहीं^_^