Ich schrieb einen Parser für ein Dateiformat namens ASN.1, das Guices TypeLiteral.getFieldType(Field)
verwendet, um generische Felder in bestimmte Java-Typen zu konvertieren, damit ich den richtigen Typ (ähnlich Jackson oder GSON Databinding) konstruieren kann. Aber da ich bereits auf Guava angewiesen bin und es scheint, einen neuen TypeLiteral-Ersatz zu haben, würde ich stattdessen verwenden. Nach dem Guave TypeToken documentation:Kann Guava's TypeToken den spezifischen Typ eines generischen Feldes bekommen?
TypeToken
ist ähnlichTypeLiteral
Klasse Guice, aber mit einem wichtigen Unterschied: Es unterstützt nicht verdinglicht Typen wieT
,List<T>
oder sogarList<? extends Number>
; währendTypeLiteral
nicht.TypeToken
ist auch serialisierbar und bietet zahlreiche zusätzliche Hilfsmethoden.
Können Sie den bestätigten Typ eines Felds mit TypeToken
? Mit anderen Worten, wie kann ich in Guava Folgendes tun?
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());
}
}
Danke, getGenericType() und resolve() ist das, was ich brauchte. \t \t TypToken > reifiedA = TypToken.of (B.Klasse) .ResolveType (B.Class.getDeclaredField ("b"). GetGenericType()); \t \t assertEquals (String.class, régifiedA.resolveType (reifiedA.getRawType(). GetDeclaredField ("a"). GetGenericType()). GetRawType()); – yonran
Diese Antwort verdient +50! Ich habe das 3 Tage lang gesucht und du hast mein Leben gerettet! –
Ich bin froh das zu hören :) –