2012-11-20 12 views
6

Napisałem analizator składni dla formatu pliku o nazwie ASN.1, który używa Guice'a TypeLiteral.getFieldType(Field) do konwersji ogólnych pól na konkretne typy Java, dzięki czemu mogę skonstruować poprawny typ (podobnie jak w przypadku łączenia plików Jackson lub GSON). Ale ponieważ już jestem zależny od Guava i wydaje się, że mam nowy zamiennik TypeLiteral, chciałbym zamiast tego użyć TypeToken. Według Guave TypeToken documentation:Czy Guzowaty Znacznik Typu może uzyskać określony typ pola ogólnego?

TypeToken jest podobna do TypeLiteral klasy Guice, ale z jedną istotną różnicą: obsługuje non-reified rodzajów takich jak T, List<T> lub nawet List<? extends Number>; podczas gdy TypeLiteral nie. TypeToken jest również szeregowalny i oferuje liczne dodatkowe metody użytkowe.

Czy można uzyskać rektyfikowany typ pola za pomocą TypeToken? Innymi słowy, w jaki sposób mogę wykonać następujące czynności w Guava?

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()); 
    } 
} 

Odpowiedz

7

Z mojej głowie, nie zweryfikowana

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

Dzięki, getGenericType() i determinację() jest to, co potrzebne. \t \t TypToken reifiedA = TypeToken.of (klasy B.) .resolveType (B.class.getDeclaredField ("b"). GetGenericType()); \t assertEquals (String.class, reifiedA.resolveType (reifiedA.getRawType(). GetDeclaredField ("a"). GetGenericType()). GetRawType()); – yonran

+0

Ta odpowiedź zasługuje na +50! Szukałem tego przez 3 dni i uratowałeś mi życie! –

+0

Miło mi to słyszeć :) –

Powiązane problemy