Java反射获取标注注解的嵌套泛型方法参数实际类型报错如何解决
问题原因
该报错是Java泛型反射的正常表现:
- 当泛型实参是不带泛型的普通类型时,
getActualTypeArguments()返回的元素类型为Class,比如List<Person1>的第一个实参就是Person1.class,可以直接强转 - 当泛型实参本身也是带泛型的参数化类型时,比如
List<Person1<?>>的第一个实参是Person1<?>,属于ParameterizedType类型,无法直接强转为Class,就会抛出你遇到的ClassCastException
解决方案
针对你使用仅支持Class类型的JSON schema生成工具的场景,直接取参数化类型的原始类型即可,兼容多层泛型嵌套、通配符等场景的代码如下:
Type typeArgument = parameterizedType.getActualTypeArguments()[0]; Class<?> actualType = Object.class; // 递归解析获取最内层的原始Class类型 while (true) { if (typeArgument instanceof Class<?>) { actualType = (Class<?>) typeArgument; break; } else if (typeArgument instanceof ParameterizedType) { // 取参数化类型的原始类型,比如Person1<?>就取Person1.class typeArgument = ((ParameterizedType) typeArgument).getRawType(); } else if (typeArgument instanceof WildcardType) { // 处理通配符场景,比如? extends Person1就取通配符的第一个上界 Type[] upperBounds = ((WildcardType) typeArgument).getUpperBounds(); if (upperBounds.length > 0) { typeArgument = upperBounds[0]; } else { break; } } else { // 泛型类型变量等其他场景按需补充逻辑,默认兜底为Object break; } }
最终得到的actualType就是Person1.class,可以直接传给你的JSON schema生成工具使用。
内容的提问来源于stack exchange,提问作者Suganthan Madhavan Pillai
相关产品推荐
相关产品推荐

