2013-02-24 108 views
6

मैं गुवा TypeToken कक्षा का उपयोग कर परीक्षण कर रहा हूं ताकि परीक्षण किया जा सके कि किसी प्रकार के मनमानी प्रकार के उदाहरण अन्य प्रकार की वस्तुओं को असाइन किए जा सकते हैं।Guava के TypeToken.isAssignable विधि को समझना

निम्नलिखित कोड का टुकड़ा में, मैं परीक्षण कर रहा हूँ अगर प्रकार List के रूप में घोषित List<String> से आबंटित कर रहे हैं, और viceversa:

TypeToken rawListType = new TypeToken<List>(){}; 
TypeToken parameterizedListType = new TypeToken<List<String>>(){}; 
System.out.println(rawListType.isAssignableFrom(parameterizedListType)); //true 
System.out.println(parameterizedListType.isAssignableFrom(rawListType)); //false 

क्यों isAssignableFrom रिटर्न के लिए दूसरी कॉल false, यह देखते हुए कि कोड के नीचे संकलित करता है , तो मैं List से List<String> (एक चेतावनी के साथ) या लेन-:

List l = null; 
List<String> l2 = null; 
l = l2; 
l2 = l; //Type Safety Warning 

मेरे अंतर्ज्ञान है कि अमरूद इन की अगर उत्तर दे रहा है इन प्रकारों की संभावना चेतावनियों के बिना असाइन किए जा सकते हैं (?)। यदि यह सही है, तो मैं संकलक की भावना में असाइन करने योग्यता की जांच कैसे कर सकता हूं, जिससे मुझे किसी अन्य ऑब्जेक्ट को (चेतावनी के साथ या बिना किसी ऑब्जेक्ट को असाइन करने की इजाजत मिलती है), जैसा कि यह दूसरे कोड स्निपेट में दिखाया गया है?

उत्तर

3

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

चूंकि आप वास्तव में संबंधित कच्चे प्रकार की असाइनमेंट की जांच करना चाहते हैं, तो आप केवल TypeToken.getRawType का उपयोग कर सकते हैं और फिर Class.isAssignableFrom का उपयोग कर सकते हैं।

संपादित करें: आपके कहे अनुसार, इस पद्धति List<Integer> और List<String> करने और एक दूसरे से आबंटित में गिना जाएगा। इससे बचने के लिए मुझे लगता है कि आपको अधिक सामान्यीकृत समाधान की आवश्यकता है:

boolean checkRawAssignability(TypeToken<?> assigned, TypeToken<?> from) { 

    //if from is a raw type, compare raw types instead 
    final Type fromType = from.getType(); 
    if (fromType instanceof Class<?>) { 
     return assigned.getRawType().isAssignableFrom((Class<?>)fromType); 
    } 

    //otherwise use normal methodology 
    return assigned.isAssignableFrom(from); 
} 

ध्यान दें कि यह समाधान सरणी प्रकारों पर विचार नहीं करता है।

+0

हाय @ पॉल। यह वही नहीं है जो मैं खोज रहा हूं, अगर मैं कच्चे प्रकार की असाइन करने योग्यता की जांच करता हूं, तो सूची सूची से असाइन करने योग्य होगी और इसी तरह, और यह सही नहीं है। मैं ऐसे मामलों में असाइनमेंट सत्यापित करने का एक तरीका ढूंढ रहा हूं जहां संकलक को अदालतों के पीछे निहित कास्ट जोड़ना होगा। – Sergio

+0

समझा - मेरा अपडेट देखें। –

+0

आपका समाधान मेरे लिए सही लगता है, क्या आपको कोई विचार है कि TypeToken ऐसा क्यों नहीं करता है? कम से कम उन्हें दस्तावेज होना चाहिए था कि विधि javadoc में मुझे लगता है। – Sergio

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

  • कोई संबंधित समस्या नहीं^_^