据我所知,从Java 6开始,桥接方法是为从非公共超类继承的公共方法生成的
class Worker { // non-public
public void doit(List<String> arg) {
}
}
public static class XXWorker extends Worker {
Method method = XXWorker.class.getMethod("doit", List.class);
Type type = method.getParameters()[0].getParameterizedType();
if (type instanceof ParameterizedType) {
Type gt = ((ParameterizedType) type).getActualTypeArguments()[0];
System.out.println("Type is -> " + gt);
}
}
我们知道,通过反射得到的
doit()
方法是由编译器生成的,是一种综合桥接方法。然而,我们发现doit()
的参数0的类型不是参数化类型,缺少类型信息String。结果,if body内的代码没有被执行。
有人知道为什么吗?
发生这种情况是因为运行时泛型的类型擦除。参数化类型仅存在于编译类型中。这与许多需要查找事物的实际类型的库传递带有正确的预期类类型的附加参数的原因相同,伪代码:
List<T> find(criteria, Class<T> theClass)
List<Customer> = find(..., Customer.class)