【发布时间】:2012-11-20 17:04:34
【问题描述】:
我为名为 ASN.1 的文件格式编写了一个解析器,它使用 Guice 的 TypeLiteral.getFieldType(Field) 将通用字段转换为特定的 Java 类型,以便我可以构造正确的类型(类似于 Jackson 或 GSON 数据绑定)。但由于我已经依赖 Guava,而且它似乎有一个新的 TypeLiteral 替代品,我想改用 TypeToken。根据Guave TypeToken documentation:
TypeToken类似于 Guice 的TypeLiteral类,但有一个重要区别:它支持非具体化类型,例如T、List<T>甚至List<? extends Number>;而TypeLiteral没有。TypeToken也是可序列化的,并提供了许多额外的实用方法。
你能用TypeToken得到一个字段的具体类型吗?换句话说,如何在 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());
}
}
【问题讨论】: