有没有办法在 Java 的列表中提取列表的类型参数?

Is there a way to extract the type parameters of a list inside a list in Java?

我正在尝试找出是否有办法获取嵌套在另一个 List 中的类型(例如 List)的参数。

例如,如何从这样的字段中提取嵌套列表的类型:

List<List<String>> strings

我找到了一种更深入的方法:

for (Field field : aClass.getDeclaredFields()) {
    //checking if field type can have parameters, for example List<String>
    if(List.class.isAssignableFrom(field.getType()) || Map.class.isAssignableFrom(field.getType())) {
        //extracting type parameters, to do this you need to cast a type to ParameterizedType and then to Class to get a simple name easily
        List<Class<?>> typeParameters = Stream.of(((ParameterizedType) field.getGenericType()).getActualTypeArguments())
                .map(type -> (Class<?>) type)
                .collect(Collectors.toList());

        //for a field like List<String> strings; this will print out: strings: List<String>
        System.out.println(field.getName() + ": " +
                        field.getType().getSimpleName() + "<" +
                        typeParameters.stream().map(Class::getSimpleName).collect(Collectors.joining(", ")) +
                        "> ");

    }
}

但是,我没有成功地将它扩展到嵌套类型。

请注意 getActualTypeArguments return 是一个 Type 数组,而不是 Class 数组。 所以你需要递归地做同样的事情:如果 getActualTypeArguments[0] instanceof ParameterizedType,你可以再次调用 getActualTypeArguments 并获取内部列表的通用类型。

另请注意,您的代码可能会抛出异常,因为 getActualTypeArguments 不一定是 Class 的 return 个实例,例如,如果您的列表是 List<? extends Object>.