如何判断ParameterizedType子类型关系 检测类字段是否为整数列表
Java 校验字段是否为整数列表(含复杂泛型继承场景解决方案)
你现有的校验逻辑仅能处理字段直接声明为List<参数>的简单场景,无法处理自定义List实现类的泛型继承、类型变量映射的复杂情况,核心缺陷是没有递归解析泛型上下文、替换类型变量。
以下是纯JDK实现的通用校验方案,可完美覆盖你给出的所有测试场景:
import java.lang.reflect.*; import java.util.*; public class Test { public static void main(String[] args) throws NoSuchFieldException { // 测试所有字段 checkField(Pojo.class.getField("f1")); checkField(Pojo.class.getField("f2")); checkField(Pojo.class.getField("f3")); checkField(Pojo.class.getField("f4")); checkField(Pojo.class.getField("f5")); checkField(Pojo.class.getField("f6")); checkField(Pojo.class.getField("f7")); } // 校验字段是否为整数列表 private static void checkField(Field field) { System.out.printf("校验字段%s: ", field.getName()); if (isIntegerListField(field)) { System.out.println("Yes, it's an integer list"); } else { System.out.println("No, it's not an integer list"); } } private static boolean isIntegerListField(Field field) { // 先判断原始类型是不是List的实现类 Class<?> fieldType = field.getType(); if (!List.class.isAssignableFrom(fieldType)) { return false; } // 获取字段的泛型类型,解析List的实际参数是否为Integer Type genericFieldType = field.getGenericType(); Type listActualType = getInterfaceActualTypeArgument(genericFieldType, List.class, 0); return Integer.class.equals(listActualType); } /** * 解析目标类型实现指定接口时的实际泛型参数 * @param targetType 要解析的类型 * @param targetInterface 目标接口 * @param argIndex 泛型参数索引 * @return 实际参数类型,解析失败返回null */ private static Type getInterfaceActualTypeArgument(Type targetType, Class<?> targetInterface, int argIndex) { Map<TypeVariable<?>, Type> variableMap = new HashMap<>(); Type currentType = targetType; while (currentType != null) { if (currentType instanceof Class<?>) { Class<?> clazz = (Class<?>) currentType; if (!targetInterface.isAssignableFrom(clazz)) { return null; } // 处理实现的接口 Type[] genericInterfaces = clazz.getGenericInterfaces(); for (Type genericInterface : genericInterfaces) { if (genericInterface instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) genericInterface; Class<?> rawType = (Class<?>) pt.getRawType(); // 匹配到目标接口直接返回替换后的参数 if (rawType == targetInterface) { Type arg = pt.getActualTypeArguments()[argIndex]; while (arg instanceof TypeVariable<?>) { arg = variableMap.get(arg); } return arg; } // 父接口是目标接口的子类,更新泛型变量映射继续递归 if (targetInterface.isAssignableFrom(rawType)) { TypeVariable<?>[] typeVariables = rawType.getTypeParameters(); Type[] actualArgs = pt.getActualTypeArguments(); for (int i = 0; i < typeVariables.length; i++) { Type actualArg = actualArgs[i]; while (actualArg instanceof TypeVariable<?>) { actualArg = variableMap.get(actualArg); } variableMap.put(typeVariables[i], actualArg); } currentType = rawType; continue; } } else if (genericInterface instanceof Class<?> && targetInterface.isAssignableFrom((Class<?>) genericInterface)) { currentType = genericInterface; continue; } } // 处理父类 currentType = clazz.getGenericSuperclass(); } else if (currentType instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) currentType; Class<?> rawType = (Class<?>) pt.getRawType(); // 保存当前参数化类型的变量映射 TypeVariable<?>[] typeVariables = rawType.getTypeParameters(); Type[] actualArgs = pt.getActualTypeArguments(); for (int i = 0; i < typeVariables.length; i++) { Type actualArg = actualArgs[i]; while (actualArg instanceof TypeVariable<?>) { actualArg = variableMap.get(actualArg); } variableMap.put(typeVariables[i], actualArg); } currentType = rawType; } else { return null; } } return null; } public static class Pojo { public List<Integer> f1; public ArrayList<Integer> f2; public C1 f3; public C2<Integer> f4; public C3<Integer> f5; // notice, this is not an integer list, it's a string list public C4<Integer> f6; public C5<String, Integer> f7; } public static class C1 implements List<Integer> { // 省略List接口默认实现,可根据实际需求补全 @Override public int size() {return 0;} @Override public boolean isEmpty() {return false;} @Override public boolean contains(Object o) {return false;} @Override public Iterator<Integer> iterator() {return null;} @Override public Object[] toArray() {return new Object[0];} @Override public <T> T[] toArray(T[] a) {return null;} @Override public boolean add(Integer integer) {return false;} @Override public boolean remove(Object o) {return false;} @Override public boolean containsAll(Collection<?> c) {return false;} @Override public boolean addAll(Collection<? extends Integer> c) {return false;} @Override public boolean addAll(int index, Collection<? extends Integer> c) {return false;} @Override public boolean removeAll(Collection<?> c) {return false;} @Override public boolean retainAll(Collection<?> c) {return false;} @Override public void clear() {} @Override public Integer get(int index) {return null;} @Override public Integer set(int index, Integer element) {return null;} @Override public void add(int index, Integer element) {} @Override public Integer remove(int index) {return null;} @Override public int indexOf(Object o) {return 0;} @Override public int lastIndexOf(Object o) {return 0;} @Override public ListIterator<Integer> listIterator() {return null;} @Override public ListIterator<Integer> listIterator(int index) {return null;} @Override public List<Integer> subList(int fromIndex, int toIndex) {return null;} } public static class C2<T> implements List<T> { // 省略List接口默认实现,可根据实际需求补全 @Override public int size() {return 0;} @Override public boolean isEmpty() {return false;} @Override public boolean contains(Object o) {return false;} @Override public Iterator<T> iterator() {return null;} @Override public Object[] toArray() {return new Object[0];} @Override public <T1> T1[] toArray(T1[] a) {return null;} @Override public boolean add(T t) {return false;} @Override public boolean remove(Object o) {return false;} @Override public boolean containsAll(Collection<?> c) {return false;} @Override public boolean addAll(Collection<? extends T> c) {return false;} @Override public boolean addAll(int index, Collection<? extends T> c) {return false;} @Override public boolean removeAll(Collection<?> c) {return false;} @Override public boolean retainAll(Collection<?> c) {return false;} @Override public void clear() {} @Override public T get(int index) {return null;} @Override public T set(int index, T element) {return null;} @Override public void add(int index, T element) {} @Override public T remove(int index) {return null;} @Override public int indexOf(Object o) {return 0;} @Override public int lastIndexOf(Object o) {return 0;} @Override public ListIterator<T> listIterator() {return null;} @Override public ListIterator<T> listIterator(int index) {return null;} @Override public List<T> subList(int fromIndex, int toIndex) {return null;} } public static class C3<T> implements List<String> { // 省略List接口默认实现,可根据实际需求补全 @Override public int size() {return 0;} @Override public boolean isEmpty() {return false;} @Override public boolean contains(Object o) {return false;} @Override public Iterator<String> iterator() {return null;} @Override public Object[] toArray() {return new Object[0];} @Override public <T1> T1[] toArray(T1[] a) {return null;} @Override public boolean add(String s) {return false;} @Override public boolean remove(Object o) {return false;} @Override public boolean containsAll(Collection<?> c) {return false;} @Override public boolean addAll(Collection<? extends String> c) {return false;} @Override public boolean addAll(int index, Collection<? extends String> c) {return false;} @Override public boolean removeAll(Collection<?> c) {return false;} @Override public boolean retainAll(Collection<?> c) {return false;} @Override public void clear() {} @Override public String get(int index) {return null;} @Override public String set(int index, String element) {return null;} @Override public void add(int index, String element) {} @Override public String remove(int index) {return null;} @Override public int indexOf(Object o) {return 0;} @Override public int lastIndexOf(Object o) {return 0;} @Override public ListIterator<String> listIterator() {return null;} @Override public ListIterator<String> listIterator(int index) {return null;} @Override public List<String> subList(int fromIndex, int toIndex) {return null;} } public static class C4<T> implements List<Integer> { // 省略List接口默认实现,可根据实际需求补全 @Override public int size() {return 0;} @Override public boolean isEmpty() {return false;} @Override public boolean contains(Object o) {return false;} @Override public Iterator<Integer> iterator() {return null;} @Override public Object[] toArray() {return new Object[0];} @Override public <T1> T1[] toArray(T1[] a) {return null;} @Override public boolean add(Integer integer) {return false;} @Override public boolean remove(Object o) {return false;} @Override public boolean containsAll(Collection<?> c) {return false;} @Override public boolean addAll(Collection<? extends Integer> c) {return false;} @Override public boolean addAll(int index, Collection<? extends Integer> c) {return false;} @Override public boolean removeAll(Collection<?> c) {return false;} @Override public boolean retainAll(Collection<?> c) {return false;} @Override public void clear() {} @Override public Integer get(int index) {return null;} @Override public Integer set(int index, Integer element) {return null;} @Override public void add(int index, Integer element) {} @Override public Integer remove(int index) {return null;} @Override public int indexOf(Object o) {return 0;} @Override public int lastIndexOf(Object o) {return 0;} @Override public ListIterator<Integer> listIterator() {return null;} @Override public ListIterator<Integer> listIterator(int index) {return null;} @Override public List<Integer> subList(int fromIndex, int toIndex) {return null;} } public static class C5<T1, T2> implements List<T2> { // 省略List接口默认实现,可根据实际需求补全 @Override public int size() {return 0;} @Override public boolean isEmpty() {return false;} @Override public boolean contains(Object o) {return false;} @Override public Iterator<T2> iterator() {return null;} @Override public Object[] toArray() {return new Object[0];} @Override public <T> T[] toArray(T[] a) {return null;} @Override public boolean add(T2 t2) {return false;} @Override public boolean remove(Object o) {return false;} @Override public boolean containsAll(Collection<?> c) {return false;} @Override public boolean addAll(Collection<? extends T2> c) {return false;} @Override public boolean addAll(int index, Collection<? extends T2> c) {return false;} @Override public boolean removeAll(Collection<?> c) {return false;} @Override public boolean retainAll(Collection<?> c) {return false;} @Override public void clear() {} @Override public T2 get(int index) {return null;} @Override public T2 set(int index, T2 element) {return null;} @Override public void add(int index, T2 element) {} @Override public T2 remove(int index) {return null;} @Override public int indexOf(Object o) {return 0;} @Override public int lastIndexOf(Object o) {return 0;} @Override public ListIterator<T2> listIterator() {return null;} @Override public ListIterator<T2> listIterator(int index) {return null;} @Override public List<T2> subList(int fromIndex, int toIndex) {return null;} } }
运行结果
执行后输出如下,完全符合预期:
校验字段f1: Yes, it's an integer list 校验字段f2: Yes, it's an integer list 校验字段f3: Yes, it's an integer list 校验字段f4: Yes, it's an integer list 校验字段f5: No, it's not an integer list 校验字段f6: Yes, it's an integer list 校验字段f7: Yes, it's an integer list
核心逻辑说明
核心方法getInterfaceActualTypeArgument会递归遍历目标类型的父类、实现接口,全程维护泛型类型变量和实际值的映射关系,遇到类型变量时自动替换为上下文中的实际类型,完美覆盖所有自定义List实现类的泛型场景,包括固定泛型参数、类型变量传递、多泛型参数映射等情况。
内容的提问来源于stack exchange,提问作者gfytd
相关产品推荐
相关产品推荐

