diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/reflect/ActualTypeMapperPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/reflect/ActualTypeMapperPool.java index 8b89c554a..136577c30 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/reflect/ActualTypeMapperPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/reflect/ActualTypeMapperPool.java @@ -39,14 +39,14 @@ public class ActualTypeMapperPool { * @return 泛型对应关系Map * @since 5.7.16 */ - public static Map getStrKeyMap(Type type){ + public static Map getStrKeyMap(Type type) { return Convert.toMap(String.class, Type.class, get(type)); } /** * 获得泛型变量对应的泛型实际类型,如果此变量没有对应的实际类型,返回null * - * @param type 类 + * @param type 类 * @param typeVariable 泛型变量,例如T等 * @return 实际类型,可能为Class等 */ @@ -59,6 +59,14 @@ public class ActualTypeMapperPool { return result; } + /** + * 获得泛型变量对应的泛型实际类型,如果此变量没有对应的实际类型,返回null + * + * @param type 类 + * @param genericArrayType 泛型数组类型 + * @return 实际类型,可能为Class等 + * @since 5.8.37 + */ public static Type getActualType(Type type, GenericArrayType genericArrayType) { final Map typeTypeMap = get(type); Type actualType = typeTypeMap.get(genericArrayType); @@ -79,7 +87,7 @@ public class ActualTypeMapperPool { * 获取指定泛型变量对应的真实类型
* 由于子类中泛型参数实现和父类(接口)中泛型定义位置是一一对应的,因此可以通过对应关系找到泛型实现类型
* - * @param type 真实类型所在类,此类中记录了泛型参数对应的实际类型 + * @param type 真实类型所在类,此类中记录了泛型参数对应的实际类型 * @param typeVariables 泛型变量,需要的实际类型对应的泛型参数 * @return 给定泛型参数对应的实际类型,如果无对应类型,对应位置返回null */ @@ -88,8 +96,8 @@ public class ActualTypeMapperPool { final Type[] result = new Type[typeVariables.length]; for (int i = 0; i < typeVariables.length; i++) { result[i] = (typeVariables[i] instanceof TypeVariable) - ? getActualType(type, (TypeVariable) typeVariables[i]) - : typeVariables[i]; + ? getActualType(type, (TypeVariable) typeVariables[i]) + : typeVariables[i]; } return result; } @@ -112,7 +120,7 @@ public class ActualTypeMapperPool { // 如果传入的非Class,例如TypeReference,获取到泛型参数中实际的泛型对象类,继续按照类处理 while (null != type) { final ParameterizedType parameterizedType = TypeUtil.toParameterizedType(type); - if(null == parameterizedType){ + if (null == parameterizedType) { break; } final Type[] typeArguments = parameterizedType.getActualTypeArguments(); @@ -123,7 +131,7 @@ public class ActualTypeMapperPool { for (int i = 0; i < typeParameters.length; i++) { value = typeArguments[i]; // 跳过泛型变量对应泛型变量的情况 - if(false == value instanceof TypeVariable){ + if (false == value instanceof TypeVariable) { typeMap.put(typeParameters[i], value); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java index ab734df30..4eaedb023 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java @@ -408,7 +408,11 @@ public class TypeUtil { return ActualTypeMapperPool.getActualType(type, (TypeVariable) typeVariable); } if (typeVariable instanceof GenericArrayType) { - return ActualTypeMapperPool.getActualType(type, (GenericArrayType) typeVariable); + //return ActualTypeMapperPool.getActualType(type, (GenericArrayType) typeVariable); + final Type actualType = ActualTypeMapperPool.getActualType(type, (GenericArrayType) typeVariable); + if(null != actualType){ + return actualType; + } } // 没有需要替换的泛型变量,原样输出