2012-06-29 24 views
10

करता प्रभावी जावा द्वितीय संस्करण, मद 28 से: "वापसी प्रकार के रूप में वाइल्डकार्ड प्रकार का प्रयोग न करें के बजाय अपने उपयोगकर्ताओं के लिए यह उन्हें मजबूर होना पड़ा के लिए अतिरिक्त लचीलापन प्रदान करते हैं। क्लाइंट कोड में वाइल्डकार्ड प्रकारों का उपयोग करने के लिए। "क्यों अमरूद के TypeToken <T> .getRawType() वापसी कक्षा <? super T> बजाय कक्षा <T>

public final Class<? super T> getRawType() 

मैं अभी पिछले अनियंत्रित डाली चेतावनी मैं कोड मैं लिख रहा हूँ के एक टुकड़े में है समझने के लिए सामान्य वाइल्डकार्ड के साथ पकड़ के लिए हो रही किया गया है और मुझे समझ नहीं आता क्यों getRawType() एक वाइल्डकार्ड प्रकार देता है।

class Base<T>{} 
class Child<T> extends Base<T>{} 

public <C> void test (TypeToken<? extends Base<C>> token) { 
    Class<? extends Base<C>> rawType = (Class<? extends Base<C>>) token.getRawType(); 
} 

मैं के रूप में यह रिटर्न एक

Class<? super ? extends Base<C>> 

उत्तर

7

यदि आपके पास TypeToken<ArrayList<String>> है और आप Class<ArrayList> ( कच्चे प्रकार) प्राप्त करना चाहते हैं तो क्या होगा। अगर यह Class<T> लौटा, तो यह Class<ArrayList<String>> लौटाएगा जो Class<ArrayList> नहीं है जो आप चाहते हैं।

+0

धन्यवाद @ न्यूवाक्ट, यह बात है मुझे समझ में नहीं आया, लेकिन यह समझ में आता है कि ArrayList ऐरेलिस्ट को बढ़ाता है। कक्षा यह लौट रहा है कि यह क्या लौट रहा है, हालांकि क्लाइंट कोड का सवाल है, यह कक्षा पर भी लौटा सकता है, क्योंकि आपको हमेशा इसे डालना होगा। – MikeB

0

token.getRawType() कास्ट करने के लिए यदि "टोकन" सामान्य प्रकार का एक प्रकार वर्ग (यानी अगर एस

TypeToken<S> 
में है

एक java.lang.reflect.Type क्लास है), फिर TypeToken.getRawType() एस से जुड़े कच्चे प्रकार को वापस कर देगा। यह क्लास ऑब्जेक्ट होगा, एस

TypeToken का स्रोत कोड देखें।

कुछ मामलों में, रणनीति कार्यान्वित काम नहीं करेगा और एक कच्चे प्रकार के होने (कई गुना होने की तरह) में ठीक है: कच्चे प्रकार Object.class

हो जाएगा उदाहरण MoreTypes के लिए देखें:

public static Class<?> getRawType(Type type) { 
... 
} else if (type instanceof TypeVariable) { 
    // we could use the variable's bounds, but that'll won't work if there are multiple. 
    // having a raw type that's more general than necessary is okay 
    return Object.class; 

} else { 
... 
} 
+0

मैंने स्रोत पढ़ा है लेकिन फिर भी ऐसी स्थिति नहीं मिल सकती है जहां एस के माता-पिता को वापस कर दिया जाता है। मैंने 'नया टाइप टोकन <वाइल्डकार्ड टाइप>() {} प्राप्त किया। GetRawType()' लेकिन यह वाइल्डकार्ड टाइप की एक श्रेणी देता है, कोई माता-पिता नहीं – MikeB

+1

ध्यान दें कि आपका 'टाइप टोकन' लिंक जीसन संस्करण को इंगित करता है। यहां गुवा संस्करण है: http://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/reflect/TypeToken.java –

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