以编程方式匹配(正式和实际)类型标记

时间:2017-04-21 12:47:37

标签: java generics reflection

在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。扩展也可以匹配子类。 是否有免费的实现解决了这个问题?

0 个答案:

没有答案