2012-11-20 5 views
6

मैंने एएसएन.1 नामक फ़ाइल प्रारूप के लिए एक पार्सर लिखा है जो जेनेरिक फ़ील्ड को विशिष्ट जावा प्रकारों में परिवर्तित करने के लिए गुइस के TypeLiteral.getFieldType(Field) का उपयोग करता है, इसलिए मैं सही प्रकार (जैक्सन या जीएसओएन डाटाबेसिंग के समान) का निर्माण कर सकता हूं। लेकिन चूंकि मैं पहले से ही अमरूद पर निर्भर हूं और ऐसा लगता है कि यह एक नया टाइप लिटरल प्रतिस्थापन है, मैं इसके बजाय TypeToken का उपयोग करना चाहता हूं। Guave TypeToken documentation के अनुसार:क्या अमरूद के टाइप टोकन को सामान्य क्षेत्र का विशिष्ट प्रकार मिल सकता है?

TypeToken Guice के TypeLiteral वर्ग के समान है, लेकिन एक महत्वपूर्ण अंतर के साथ: यह गैर reified प्रकार जैसे T, List<T> या यहाँ तक कि List<? extends Number> समर्थन करता है; जबकि TypeLiteral नहीं है। TypeToken भी serializable है और कई अतिरिक्त उपयोगिता तरीकों की पेशकश करता है।

क्या आप TypeToken का उपयोग करके एक फ़ील्ड का संशोधित प्रकार प्राप्त कर सकते हैं? दूसरे शब्दों में, मैं गुवा में निम्नलिखित कैसे कर सकता हूं?

import org.junit.Test; 
import com.google.inject.TypeLiteral; 
public class FieldTypeTest { 
    public static class A<T> { 
     T a; 
    } 
    public static class B { 
     A<String> b; 
    } 

    @Test 
    public void testTypeToken() throws SecurityException, NoSuchFieldException { 
     TypeLiteral<?> reifiedA = TypeLiteral.get(B.class).getFieldType(B.class.getDeclaredField("b")); 
     assertEquals(String.class, reifiedA.getFieldType(reifiedA.getRawType().getDeclaredField("a")).getRawType()); 
    } 
} 

उत्तर

7

मेरे सिर से, सत्यापित नहीं

Type t = B.class.getDeclaredField("b").getGenericType(); 
Class<?> p = TypeToken.of(t).resolve(
     /* T */ A.getTypeParameters()[0]).getRawType(); 
// p should be String.class 
+2

धन्यवाद, getGenericType() और संकल्प() मैं क्या जरूरत है। \t \t टाइप टोकन reifiedA = TypeToken.of (B.class) .resolveType (B.class.getDeclaredField ("b")। GetGenericType()); \t \t assertEquals (स्ट्रिंग.क्लास, reifiedA.resolveType (reifiedA.getRawType()। GetDeclaredField ("a")। GetGenericType())। GetRawType()); – yonran

+0

यह उत्तर +50 के लायक है! मैं इसे 3 दिनों के लिए देख रहा था और आपने मेरी जान बचाई! –

+0

मुझे यह सुनकर खुशी हुई :) –

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