2012-05-29 17 views
9

से "क्लास" वस्तु मैं सामान्य समारोह बनाना चाहते कि वापसी XML दस्तावेज़ (JAXB का उपयोग करके) की वस्तु प्रतिनिधित्व। मुझे "क्लास" ऑब्जेक्ट को JAXBContext कन्स्ट्रक्टर को पास करने की आवश्यकता है, लेकिन मैं इसे टी से कैसे प्राप्त कर सकता हूं?जाओ सामान्य प्रकार टी

public <T> readXmlToObject(String xmlFileName, T jaxbClass) { 
    JAXBContext context = JAXBContext.newInstance(T.class); // T.class - here error, how to get it? 
    ....... 
} 
+1

'प्रकार विलोपन' :-) –

उत्तर

13

बजाय वर्ग वस्तु दर्रा और यह आसान है। वर्ग के साथ शुरू और फिर वस्तु हेरफेर प्रकार पैरामीटर मिलान करने के लिए:

public <T> T readXmlToObject(String xmlFileName, Class<T> jaxbClass) { 
     JAXBContext context = JAXBContext.newInstance(jaxbClass); // T.class - here error, how to get it? 
     Object o = context.createUnmarshaller().unmarshal(new File(xmlFileName)); 
     return jaxbClass.cast(o); 
} 

विचार यहाँ के बाद से आप वस्तु से प्रकार पैरामीटर अलग नहीं कर सकता, तो आप इसे दूसरी तरह के आसपास क्या करना है कि है।

+0

(मुझे नहीं लगता कि 'विस्तारित' आपको कुछ भी खरीदता है।) –

+0

@ टॉमहॉविन-टाइललाइन आप सही हैं। – biziclop

3

आप रन टाइम पर कक्षा नहीं प्राप्त कर सकते हैं। जावा टाइप सेफ एरर का उपयोग कर जेनरिक लागू करता है जिसका अर्थ है कि जेनेरिक प्रकार की समझ केवल संकलन के माध्यम से लागू होती है। यदि आप अपनी कक्षा प्राप्त करना चाहते हैं तो आपको रन टाइम पर वास्तविक ऑब्जेक्ट को अंतःक्रिया करना होगा।

+2

-1 गलत के लिए खोज! कक्षा में पारित किया जा रहा है। समस्या विधि हस्ताक्षर – Bohemian

+1

इनपुट के लिए धन्यवाद है। जैसा लिखा है कि यह काम नहीं करेगा, लेकिन मैं टी के बजाए कक्षा में इनपुट बदलने के साथ आपका मुद्दा देखता हूं। यह ठीक होगा। हालांकि यह अच्छा होगा, अगर जावा की खराब जेनेरिक इम्प्लस की वजह से यह चिंता भी नहीं थी। –

+0

मैंने अपना डाउनवोट हटा दिया - आपका जवाब नहीं है * वह * गलत :) – Bohemian

1

this SO answer पर एक नज़र डालें।

असल में, टाइप टी रनटाइम पर उपलब्ध नहीं है - जावा जेनरिक erasure by the compiler के अधीन हैं।

सौभाग्य से आप पहले से ही, अपने वर्ग का एक उदाहरण है, इसलिए आप वहां से प्रकार की जानकारी प्राप्त कर सकते हैं: इस

public <T> readXmlToObject(String xmlFileName, Class<T> class) { 
+0

-1 पूरी तरह से काम नहीं करेगा। 'jaxbClass.getClass()' 'class.class' वापस कर देगा। और अगर आप गलत भी हो - विलोपन एक समस्या यहाँ क्योंकि वर्ग भेजी जा रही है नहीं है – Bohemian

+0

आह -। मैं मान लिया है कि क्योंकि यह (बल्कि कक्षा है कि यह वर्ग का एक उदाहरण था की तुलना में टी करने के लिए विवश किया गया था अगर तुम मिल मेरी बहाव ...) –

+0

मैं आपको प्राप्त करता हूं, लेकिन लगता है कि यह उसकी समस्या है - उसने पैरामीटर के लिए गलत प्रकार को कोड किया है। वह * 'टी' में गुजर रहा नहीं है, क्योंकि उसके पास कॉल के बाद तक' टी' का उदाहरण नहीं होगा, लेकिन वह 'कक्षा ' के उदाहरण में गुजर सकता है। मैं मानता हूं कि मैं पैरामीटर नाम 'jaxbClass' द्वारा जा रहा हूं, जो दृढ़ता से सुझाव देता है कि यह' वर्ग 'है। – Bohemian

1

कोशिश, कुछ दूसरों को सुनो ... आप इसे प्राप्त कर सकते हैं।

सीधे शब्दों में Class<T> को jaxbClass पैरामीटर के प्रकार बदलने के लिए:

public <T> T readXmlToObject(String xmlFileName, Class<T> jaxbClass) { 
    JAXBContext context = JAXBContext.newInstance(jaxbClass); 
    ....... 
} 
6

डॉन 'की तरह वर्ग में ही पारित करने के लिए

public <T> readXmlToObject(String xmlFileName, T jaxbClass) { 

    // if jaxbClass is an instance of the data object, you can do this: 
    JAXBContext context = JAXBContext.newInstance(jaxbClass.getClass()); 

    // alternatively if jaxbClass is an instance of the Class object: 
    JAXBContext context = JAXBContext.newInstance(jaxbClass); 
    // ...... 
} 
0
public class XYZ<T> { 
    ... 
    private Class<T> tClass;  
    ... 
    public <T> readXmlToObject(String xmlFileName) { 
     JAXBContext context = JAXBContext.newInstance(tClass); 
     ... 
    } 
    ... 
} 
+0

मुझे नहीं लगता कि यह काम करेगा क्योंकि tClass प्रारंभ नहीं किया गया है और आप "JAXBContext.newInstance (..)" कॉल पर एक शून्य में गुज़रने के लिए समाप्त हो जाते हैं। –

+0

आप सही हैं, @ go-rose-hulman। –

+1

मेरे कोड में मैंने इसे ऐसा किया: निजी कक्षा इकाई क्लास; अंतिम पैरामीटरेट टाइप प्रकार = (पैरामीटरेट टाइप टाइप) getClass()। getGenericSuperclass(); इकाई क्लास = (कक्षा ) type.getActualTypeArguments() [0]; –

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