2014-09-30 15 views
6

मैं अपनी परियोजना में गुवा TypeToken कक्षा का उपयोग कर रहा हूं, लेकिन मुझे एक अप्रत्याशित परिणाम मिल रहा है।अमरूद टाइप टोकन और जेनेरिक क्लासेस

मैं MyGenericClass<T> है:

public class MyGenericClass<T> implements MyInterface { 

    private TypeToken<T> recordType; 

    public MyGenericClass(String name) { 
     this.recordType = new TypeToken<T>(getClass()) {}; 

     // ... 
    } 

    // ... 

    @SuppressWarnings("unchecked") 
    protected Class<T> getRecordType() { 
     return (Class<T>) recordType.getRawType(); 
    } 
} 

तो अगर मैं new MyGenericClass<String>() के माध्यम से एक वस्तु का दृष्टांत और फिर getRecordType() मैं java.lang.String प्राप्त करने की उम्मीद आह्वान, बजाय मैं java.lang.Object हो रही है।

लेकिन, अगर मैं सामान्य वर्ग का विस्तार:

public class MyStringImpl extends MyGenericClass<String> { 
    // ... 
} 

और इस नए वर्ग का दृष्टांत: new MyStringImpl() तो मैं सही परिणाम मिलता है।

ऐसा क्यों हो रहा है? क्या यह TypeToken का अनुमानित व्यवहार है?

+2

* "क्या यह टाइप टोकन का अपेक्षित व्यवहार है?" * हां, यह है। – Radiodef

उत्तर

13

यह काम आप एक ही गुमनाम उपवर्ग चाल की जरूरत बनाने के लिए जब आप MyGenericClass का दृष्टांत:

new MyGenericClass<String>() {} 

आपको लगता है कि उसके बाद आप StringgetRecordType द्वारा वापस मिल जाएगा करते हैं। यह आवश्यक क्यों है JavaDocs for that TypeToken constructor में समझाया गया है।

ग्राहक खाली अज्ञात सबक्लास बनाते हैं। ऐसा करने से गुमनाम वर्ग के प्रकार पदानुक्रम में टाइप पैरामीटर को एम्बेड किया जाता है ताकि हम इसे मिटाए जाने के बावजूद रनटाइम पर पुन: स्थापित कर सकें।

14

इयान के उत्तर में कुछ उबाऊ विवरण जोड़ने के लिए: यह अच्छा होगा अगर TypeToken आपके द्वारा अपेक्षित तरीके से काम करता है, लेकिन यह असंभव है। जब आप

public class MyGenericClass<T> implements MyInterface {...} 

घोषित JVM विलोपन के कारण की तरह

public class MyGenericClass<Object> implements MyInterface {...} 

कुछ देखता है।

लेकिन आप MyStringImpl इस्तेमाल किया दर्ज हैं और Class#getGenericSuperclass() के माध्यम से प्राप्त किया जा सकता जेनरिक की परिभाषा में तो

public class MyStringImpl extends MyGenericClass<String> {...} 

घोषित जब। यह TypeToken के पीछे जादू का एक हिस्सा है।

+2

+1 आपकी व्याख्या के लिए धन्यवाद – davioooh

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