有没有办法在 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>
.
我正在尝试找出是否有办法获取嵌套在另一个 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>
.