diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/TypeUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/TypeUtil.java
index 86ec1b7d5..768065df8 100644
--- a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/TypeUtil.java
+++ b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/TypeUtil.java
@@ -13,6 +13,7 @@
package org.dromara.hutool.core.reflect;
import org.dromara.hutool.core.array.ArrayUtil;
+import org.dromara.hutool.core.collection.ListUtil;
import org.dromara.hutool.core.util.ObjUtil;
import java.lang.reflect.Field;
@@ -21,6 +22,7 @@ import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.lang.reflect.WildcardType;
+import java.util.List;
import java.util.Map;
/**
@@ -276,23 +278,69 @@ public class TypeUtil {
* @since 4.5.2
*/
public static ParameterizedType toParameterizedType(final Type type) {
- ParameterizedType result = null;
+ return toParameterizedType(type, 0);
+ }
+
+ /**
+ * 将{@link Type} 转换为{@link ParameterizedType}
+ * {@link ParameterizedType}用于获取当前类或父类中泛型参数化后的类型
+ * 一般用于获取泛型参数具体的参数类型,例如:
+ *
+ *
{@code + * class A+ *+ * class B extends A ; + * }
+ * 通过此方法,传入B.class即可得到B对应的{@link ParameterizedType},从而获取到String
+ *
+ * @param type {@link Type}
+ * @param interfaceIndex 实现的第几个接口
+ * @return {@link ParameterizedType}
+ * @since 4.5.2
+ */
+ public static ParameterizedType toParameterizedType(final Type type, final int interfaceIndex) {
if (type instanceof ParameterizedType) {
- result = (ParameterizedType) type;
- } else if (type instanceof Class) {
- final Class> clazz = (Class>) type;
- Type genericSuper = clazz.getGenericSuperclass();
- if (null == genericSuper || Object.class.equals(genericSuper)) {
- // 如果类没有父类,而是实现一些定义好的泛型接口,则取接口的Type
- final Type[] genericInterfaces = clazz.getGenericInterfaces();
- if (ArrayUtil.isNotEmpty(genericInterfaces)) {
- // 默认取第一个实现接口的泛型Type
- genericSuper = genericInterfaces[0];
+ return (ParameterizedType) type;
+ }
+
+ if (type instanceof Class) {
+ final ParameterizedType[] generics = getGenerics((Class>) type);
+ if(generics.length > interfaceIndex){
+ return generics[interfaceIndex];
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * 获取指定类所有泛型父类和泛型接口
+ *
+ * @param clazz 类
+ * @return 泛型父类或接口数组
+ * @since 6.0.0
+ */
+ public static ParameterizedType[] getGenerics(final Class> clazz) {
+ final List