2012-07-14 24 views
7

मैं एक वर्ग है कि इस समारोह इस सूत्र के पहले जवाब में वर्णित बस के रूप में साथ जेनरिक का एक ArrayList deserializes है: Java abstract class function generic Typeसमय त्रुटि gson साथ deserializing

public <T> ArrayList<T> arrayType(String data){ 
    return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass())); 
} 

ग्रहण मुझे TypeToken कास्ट करने के लिए पूछता है इस में जिसके परिणामस्वरूप

public <T> ArrayList<T> arrayType(String data){ 
    return g.fromJson(data, (Type) TypeToken.get(new ArrayList<T>().getClass())); 
} 

(Sinde समारोह fromJson एक प्रकार, एक TypeToken नहीं की जरूरत है) परिणाम के रूप में मैं इस त्रुटि मिलती है:

java.lang.ClassCastException: com.google.gson.reflect.TypeToken cannot be cast to java.lang.reflect.Type 

gson user manual में वे आपको बता इस समारोह

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType(); 
Collection<Integer> ints2 = gson.fromJson(json, collectionType); 

बुला का सही तरीका है और मैं नहीं देख सकता मैं गलत क्या कर रहा हूँ (अगर यह एक वैध जवाब है, यही कारण है कि मैं इस डाली हो रही है त्रुटि?)

+1

'नया ऐरेलिस्ट () .getClass()' बिल्कुल 'ArrayList.class' – newacct

उत्तर

10

ठीक है आप TypeToken.get पर कॉल कर रहे हैं, जो TypeToken देता है - Type नहीं। उदाहरण में आप दिखा रहे हैं कि कौन सा काम करता है, यह TypeToken.getType() का उपयोग कर रहा है, जो Type देता है।

तो तुम सकता है उपयोग:

return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass()).getType()); 

... और है कि आप एक Type वापसी होगी, लेकिन यह नहीं हो सकता है क्या आप वास्तव में चाहते हैं। विशेष रूप से, टाइप एरर के कारण जो आपको उसी साइट को वापस कर देगा जो T है जिसे आप कॉल साइट से निर्दिष्ट करते हैं। यदि आप टाइप करना चाहते हैं कि वास्तव मेंArrayList<T> को प्रतिबिंबित करें, तो आपको कक्षा में विधि को पारित करने की आवश्यकता होगी, हालांकि मुझे पूरी तरह से यकीन नहीं है कि वहां से कहां जाना है। (जावा प्रतिबिंब एपीआई बहुत स्पष्ट है, जब यह मेरे अनुभव में, जेनरिक की बात आती नहीं है।)

एक के रूप में अलग रूप में, मैं सरणियों, नहीं ArrayList से कोई लेना देना कुछ है के लिए एक विधि arrayType बुलाया उम्मीद थी।

+0

वाउ जैसा ही है, जो तेज़ था, मैं इसका परीक्षण कर रहा हूं। वैसे भी अग्रिम धन्यवाद। – dinigo

+0

मुझे अंततः एक तर्क के रूप में प्रकार को पारित करना पड़ा। आपने मुझे जो कुछ भी चेतावनी या त्रुटि के बिना अपने JSON को पार्स किया लेकिन अंत में उसने मुझे ऐरेलिस्ट के प्रत्येक तत्व तक पहुंचने नहीं दिया। यह लंबाई तक सही होने के बावजूद उन्हें एक्सेस करने में असफल रहा और 'toString()' विधि काम कर रही थी। – dinigo