作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我为一种名为 ASN.1 的文件格式编写了一个解析器,它使用 Guice 的 TypeLiteral.getFieldType(Field)
将通用字段转换为特定的 Java 类型,以便我可以构造正确的类型(类似于 Jackson 或 GSON 数据绑定(bind))。但是因为我已经依赖 Guava 并且它似乎有一个新的 TypeLiteral 替代品,所以我想使用 TypeToken
反而。根据Guave TypeToken documentation :
TypeToken
is similar to Guice'sTypeLiteral
class, but with one important difference: it supports non-reified types such asT
,List<T>
or evenList<? extends Number>
; whileTypeLiteral
does not.TypeToken
is also serializable and offers numerous additional utility methods.
你能用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());
}
}
最佳答案
我的想法,未经验证
Type t = B.class.getDeclaredField("b").getGenericType();
Class<?> p = TypeToken.of(t).resolve(
/* T */ A.getTypeParameters()[0]).getRawType();
// p should be String.class
关于java - Guava 的 TypeToken 能否获取泛型字段的具体类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13464975/
我是一名优秀的程序员,十分优秀!