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 233f4ad64..ffceb4ed7 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 @@ -52,7 +52,11 @@ public class TypeUtil { } else if (type instanceof ParameterizedType) { return (Class) ((ParameterizedType) type).getRawType(); } else if (type instanceof TypeVariable) { - return (Class) ((TypeVariable) type).getBounds()[0]; + //return (Class) ((TypeVariable) type).getBounds()[0]; + final Type[] bounds = ((TypeVariable) type).getBounds(); + if (bounds.length == 1) { + return getClass(bounds[0]); + } } else if (type instanceof WildcardType) { final Type[] upperBounds = ((WildcardType) type).getUpperBounds(); if (upperBounds.length == 1) { diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/util/TypeUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/util/TypeUtilTest.java index aa29cfed5..a8654dcfa 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/util/TypeUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/util/TypeUtilTest.java @@ -82,6 +82,19 @@ public class TypeUtilTest { Assertions.assertEquals(Long.class, idType); } + @Test + public void getClasses() { + Method method = MethodUtil.getMethod(Parent.class, "getLevel"); + Type returnType = TypeUtil.getReturnType(method); + Class clazz = TypeUtil.getClass(returnType); + Assertions.assertEquals(Level1.class, clazz); + + method = MethodUtil.getMethod(Level1.class, "getId"); + returnType = TypeUtil.getReturnType(method); + clazz = TypeUtil.getClass(returnType); + Assertions.assertEquals(Object.class, clazz); + } + public static class Level3 extends Level2{ } @@ -95,4 +108,9 @@ public class TypeUtilTest { private T id; } + @Data + public static class Parent, B extends Long> { + private T level; + } + }