मैं सिर्फ एक खाली List
तत्व है जो प्रकार String
का माना जाता है कि कर रहे हैं के साथ पाने के लिए इस fine looking syntaxजेनेरिक प्रकार की कक्षा कैसे प्राप्त करें जब इसका कोई पैरामीटर न हो?
Collections.<String>emptyList()
बारे में सीखा। जावा के स्रोत इस तरह दिखता है: अगर मैं इस तरह से जहां सामान्य प्रकार पैरामीटर सूची में दिखाई नहीं देता में एक विधि कोड
public static final List EMPTY_LIST = new EmptyList<Object>();
:
public static final <T> List<T> emptyList() {
return (List<T>) EMPTY_LIST;
}
अब, वहाँ किसी भी तरह से मैं कैसे वास्तविक वर्ग कि T
हो जाता है का उपयोग कर सकते है?
मैं कह रहा हूँ, अब कोड करने के लिए करने के लिए अपने दृष्टिकोण एक ही बात
private <T> T get(String key, Class<T> clazz) {
// here I can do whatever I want with clazz, e.g.:
return clazz.cast(value);
}
हो गया होता अगर मैं clazz
-parameter मैं cast()
ऐसा करने में सक्षम नहीं होगा हटा दिया। जाहिर है मैं
return (T) value;
कर सकता है, लेकिन है कि मुझे हमेशा की तरह चेतावनी Type safety: Unchecked cast from Object to T
देता है। ठीक है, @SuppressWarnings("unchecked")
यहां मदद करता है, लेकिन असल में मैं विधि के इच्छित रिटर्न प्रकार के साथ कुछ करना चाहता हूं। मैं एक स्थानीय चर
T retValue;
जोड़ देते हैं तो मैं null
मदद नहीं करता है कुछ के साथ यह आरंभ करना होगा,। इसे
@SuppressWarnings("unchecked")
T retValue = (T) value;
मैं असाइन कर सकता हूं, उदाहरण के लिए
retValue.getClass().getName()
लेकिन कलाकारों में विफल रहता है के बारे में मैं T
फिर से कोई जानकारी के साथ खत्म हो रहे हैं।
चूंकि जावा (या कम से कम मेरे जावा 6) में रनटाइम के दौरान जेनेरिक जानकारी नहीं है, इसलिए मैं वर्तमान में ऐसा करने का तरीका नहीं सोच सकता। क्या उधर रास्ता है? या क्या मुझे यहां अपने "पुराने" दृष्टिकोण से चिपकना है?
कृपया ध्यान दें कि मैंने जो उदाहरण दिया है वह बहुत सरल है और यह बहुत समझ में नहीं आता है। मैं यहां और अधिक जटिल चीजें करना चाहता हूं, लेकिन यह दायरे से बाहर है।
[इस सवाल] (http://stackoverflow.com/questions/2434041/instantiating-generics-type-in-java) –
@NitzanVolman: एक निश्चित सीमा तक आप सही हैं, लेकिन यह नहीं है पूरी तरह। – sjngm