2012-05-23 8 views
6

मैं एक प्राथमिकता वर्ग बनाता हूं और गेटर्स के लिए मैं रनटाइम-टाइप टोकन का उपयोग नहीं करना चाहता हूं।कक्षा <T> का उदाहरण प्राप्त करें [रनटाइम-टाइप टोकन]

public <T> T get(String key, Class<T> clazz) { 
    // do some crazy stuff (e.g. Double <-> Float) 
} 

कि अप करने के लिए, सब कुछ ठीक काम करता है:

तो यहाँ मेरी गेटर तरीका है। लेकिन मुझे लगता है कि कक्षा पैरामीटर वैकल्पिक होगा।

public <T> T get(String key) { 
    // return get(key, Class<T>); 
} 

अब प्रश्न:: वहाँ ऐसा करने के लिए एक रास्ता है

boolean b = preferences.get(key); 

तो मैं एक अतिरिक्त विधि जोड़ सकता हूँ? Class<T> का उदाहरण/प्राप्त करने का कोई तरीका है।

यह एक छोटा सा वैकल्पिक हल के साथ संभव है:

public <T> T get(String key, T... args) { 
    return get(key, (Class<T>) args.getClass().getComponentType()); 
} 

public <T> T get(String key, Class<T> clazz) { 
    System.out.println("key : " + key); 
    System.out.println("clazz: " + clazz); 
} 

// using 
Boolean b = get("mykey"); 

उत्तर

3

यह एक छोटे से कामकाज के साथ संभव है।

public <T> T get(String key, T... args) { 
    return get(key, (Class<T>) args.getClass().getComponentType()); 
} 

public <T> T get(String key, Class<T> clazz) { 
    System.out.println("key : " + key); 
    System.out.println("clazz: " + clazz); 
} 

// using 
Boolean b = get("mykey"); 

जेप मुझे varargs भी पसंद नहीं है, लेकिन यह अब तक काम करता है।

+0

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

+0

@ बोल्टक्लॉक असल में, मैंने गलती से उस दूसरे प्रश्न में अपना जवाब पोस्ट किया। मैंने ** तुरंत ** हटा दिया और इसे यहां पोस्ट किया। तो मेरा जवाब कभी दो बार मौजूद नहीं है। [जेएफवाईआई] –

+0

आह, मैं देखता हूं। कभी-कभी सिस्टम चिपकाए गए उत्तरों के बारे में पसंद करता है। इसे क्लीयर करने के लिए शुक्रिया! – BoltClock

3

आप नहीं कर सकते। लेकिन यदि आप क्लास पैरामीटर को वैकल्पिक होने के लिए चाहते हैं, तो बस null पास करें और जांचें कि जब आप इसका उपयोग करते हैं तो यह शून्य नहीं है।

यदि आप इसे बाएं हाथ से अनुमानित करना चाहते हैं - यह संभव नहीं है।

2

नहीं। सामान्य प्रकार की जानकारी कॉलिंग विधि में संग्रहीत होती है, संकलित T get(String key) स्वयं ही जानता है कि यह सामान्य है लेकिन इसका पता लगाने का कोई तरीका नहीं है कि इसे किस कंक्रीट प्रकार का उपयोग करने के लिए उपयोग किया गया था।

Integer i = getPref("integer"); 
System.out.println(i); 

@SuppressWarnings("unchecked") 
static <T> T getPref(String x) { 
    return (T)properties.get(x); 
} 

यहाँ, प्रकार <T> वास्तव में बाएं हाथ की ओर से अनुमान लगाया जाता है:

//code 
public <T> T get(String key) 
//calling code 
Integer value = get("value"); 

//once compiled 
public Object get(String key) 
//calling code 
Integer value = (Integer) get("value"); 
2

आप कोड इस तरह का हो सकता है। ध्यान रखें कि यह केवल Integer पर एक स्पष्ट डाउनकास्ट से बचने में आपकी सहायता करने के लिए है - मेरे लिए व्यक्तिगत रूप से पर्याप्त है और मैं अक्सर ऐसे जानवरों का उपयोग करता हूं। इसके बारे में जागरूक होने का एक और मुद्दा यह है कि जावा का प्रकार अनुमान काफी लंगड़ा है और आप किसी अन्य विधि के तर्क के रूप में getPref पर कॉल करने में सक्षम नहीं होंगे और तर्क प्रकार अनुमानित होगा।

+0

तो ऐप का प्राथमिकता सिस्टम वरीयता बन जाएगी! और यह समस्या का समाधान नहीं करता है। आप एक इंटीजर को डबल में नहीं डाल सकते! –

+1

@MarcelJaeschke यदि मैं सिस्टम prefs का उदाहरण उदाहरण के रूप में उपयोग करता हूं तो इससे कोई फर्क नहीं पड़ता? यह कोड में एक अविकसित चर 'वरीयताओं' डालने से स्पष्ट है। और यदि आप गलत प्रकार की प्राथमिकता तक पहुंचते हैं तो कुछ भी आपको क्लास कास्ट अपवाद से बचा नहीं सकता है। –

+0

और जब उल्लंघन विफल हो जाता है तो आप 'get12ref (" foo ", Integer.class)' –

1

आप नहीं कर सकते हैं, लेकिन ...

बजाय जेनरिक के माध्यम से अधिक भार, इस पद्धति पर विचार करें:

public boolean getBoolean(String key) { 
    // boolean impl here 
} 

public float getFloat(String key) { 
    // float impl here 
} 

// etc 

इतना ही नहीं यह कोड करने के लिए आसान है, लेकिन बहुत उपयोग करना आसान है - पर आप कम से कम पता है कि किस प्रकार स्वीकार्य हैं।
अपने वर्तमान कोड के साथ, इस संकलन होगा:

SomeUnsupportedClass x = preferences.get("foo", SomeUnsupportedClass.class); 

लेकिन यह कार्यावधि में विस्फोट कर दे, क्योंकि आप इसे समर्थन करने के लिए कोड नहीं मिला है।

वैसे, यह बुरा है: आप रनिंग समय पर कोडिंग समय पर समस्याओं को पकड़ना चाहते हैं।

+0

मुझे लगता है कि जो भी मिलता है() बिल्कुल वही है जो आपने उल्लेख किया है। बीटीडब्ल्यू: जब आप getBoolean (key) {return (boolean) map.get (key)} का उपयोग करते हैं तो आपको एक त्रुटि मिलेगी और मान एक स्ट्रिंग है? –

+1

रनटाइम पर, लेकिन आपको एक प्रकार का मेल नहीं मिला है, इससे कोई फर्क नहीं पड़ता कि आप किस कोड पैटर्न का उपयोग करते हैं। लेकिन जब आप इस प्रकार को जानते हैं, तो आप यह कर सकते हैं 'अगर (! (मूल्य उदाहरण बोउलेन)) नए अवैध अर्ग्यूमेंट अपवाद ("के लिए मूल्य' '+ कुंजी +' एक बुलियन नहीं है, लेकिन एक" + value.getClass() है) ; 'या अधिक जानकारी देने के समान, या अगर आप चाहें तो विस्फोट के बिना' शून्य 'वापस लौटें। – Bohemian

+0

डाउनवोट क्यों? – Bohemian

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