You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:15:01