在Guava中,有一种方法可以通过实际的方式以编程方式替换正式类型参数:http://google.github.io/guava/releases/20.0/api/docs/com/google/common/reflect/TypeResolver.html。为了扭转这种局面,我想找出如何以编程方式匹配几种给定类型:
TypeToken<?>
t1 = new TypeToken<List<String>>() {},
t2 = new TypeToken<List<?>>() {},
t3 = new TypeToken<List<? extends Number>>() {},
t4 = new TypeToken<L>() {},
t5 = new TypeToken<Map<?, ?>>(){},
t6 = new TypeToken<Map<?, String>>() {},
t7 = new TypeToken<Integer>(){};
match(t1, t3); // returns null
match(t2, t1); // returns LinkedHashMap(WildcardType(?) => Class<String>)
match(t1, t2); // returns null
match(t4, t1); // returns LinkedHashMap(TypeVariable("L") => ParameterizedType(List<String>));
match(t5, t6); // returns LinkedHashMap(
// WildcardType(?) => WildcardType(?),
// WildcardType(?) => Class<String>
// )
match(t4, t7); // returns LinkedHashMap(TypeVariable("L") => Class<Integer>);
如果类型匹配,它至少应该将正式类型参数的映射返回到实际类型,否则null
。扩展也可以匹配子类。
是否有免费的实现解决了这个问题?