
今天遇到一个奇怪问题,一个工具类报错,工具类的作用是根据泛型参数解析Request中的参数,封装实体类,实现属性注入功能,用在SpringMVC上,报错如下:
processing failed; nested exception is java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class] with root cause
java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
以下为类定义
public class EntityWrapper<T> extends Wrapper<T> { public Class<T> getTClass(){ public Class<T> getTClass() { Object tbb = getClass().getGenericSuperclass(); Object[] pnk = ((ParameterizedType)tbb).getActualTypeArguments(); @SuppressWarnings("unchecked") Class<T> tClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; return tClass; } } }
调用处的代码
EntityWrapper<Product> entityWrapper = new EntityWrapper<Product>(entityClass);
我们简化一下这个问题,编写以下代码:我们的目的是在构造方法中获取到User类,从而对User类的结构进行分析。
public class TestG { public static void main(String[] args) { MM<User> mm = new MM<User>(); } } class User{ } class MM<T> extends M<T>{ public MM() { //返回直接继承的父类类型 Object tbb = getClass().getGenericSuperclass(); System.out.println(tbb.getClass().getSimpleName()); Object[] pnk = ((ParameterizedType)tbb).getActualTypeArguments(); System.out.println((Class)pnk[0]); } } class M<T>{ }
报错是一摸一样的,测试发现,如果父类的泛型跟子类一样,都是T,则是无法获取到父类的泛型的。
如果父类的泛型是固定的,则可获取到,很奇怪。
此问题未解决。
临时的解决方案:
EntityWrapper<Product> entityWrapper = new EntityWrapper<>(Product.class);