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 doTypeLiteral
klasy Guice, ale z jedną istotną różnicą: obsługuje non-reified rodzajów takich jakT
,List<T>
lub nawetList<? extends Number>
; podczas gdyTypeLiteral
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());
}
}
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
Ta odpowiedź zasługuje na +50! Szukałem tego przez 3 dni i uratowałeś mi życie! –
Miło mi to słyszeć :) –