Ho scritto un parser per un formato di file chiamato ASN.1 che utilizza Guice TypeLiteral.getFieldType(Field)
per convertire campi generici in tipi specifici di Java in modo da poter creare il tipo corretto (simile al database di Jackson o GSON). Ma dato che sono già dipendente da Guava e sembra avere una nuova sostituzione di TypeLiteral, mi piacerebbe usare invece TypeToken
. Secondo il Guave TypeToken documentation:Il tipoToken di Guava può ottenere il tipo specifico di un campo generico?
TypeToken
è simile alla classe di GuiceTypeLiteral
, ma con una differenza importante: Supporta tipi non reificato comeT
,List<T>
o addiritturaList<? extends Number>
; mentre loTypeLiteral
no.TypeToken
è anche serializzabile e offre numerosi metodi di utilità aggiuntivi.
È possibile ottenere il tipo reificato di un campo utilizzando TypeToken
? In altre parole, come posso fare quanto segue in 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());
}
}
Grazie, getGenericType() e la determinazione() è quello che mi serviva. \t \t TypeToken > reifiedA = TypeToken.of (B.class) .resolveType (B.class.getDeclaredField ("b"). GetGenericType()); \t \t assertEquals (String.class, reifiedA.resolveType (reifiedA.getRawType(). GetDeclaredField ("a"). GetGenericType()). GetRawType()); – yonran
Questa risposta merita +50! Stavo cercando questo per 3 giorni e mi hai salvato la vita! –
Sono felice di sentirlo :) –