2012-11-20 2 views
6

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 ähnlich TypeLiteral Klasse Guice, aber mit einem wichtigen Unterschied: Es unterstützt nicht verdinglicht Typen wie T, List<T> oder sogar List<? extends Number>; während TypeLiteral 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()); 
    } 
} 

Antwort

7

Von meinem Kopf, nicht überprüft

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

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

+0

Diese Antwort verdient +50! Ich habe das 3 Tage lang gesucht und du hast mein Leben gerettet! –

+0

Ich bin froh das zu hören :) –