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 2c75ff749..70d92ca41 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 @@ -40,7 +40,10 @@ public class TypeUtil { } else if (type instanceof ParameterizedType) { return (Class) ((ParameterizedType) type).getRawType(); } else if (type instanceof TypeVariable) { - return (Class) ((TypeVariable) type).getBounds()[0]; + 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/cn/hutool/core/util/TypeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java index 81c9f030d..a67ed9cd8 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/TypeUtilTest.java @@ -1,48 +1,61 @@ package cn.hutool.core.util; -import lombok.Data; -import org.junit.Assert; -import org.junit.Test; - import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; +import lombok.Data; +import org.junit.Assert; +import org.junit.Test; public class TypeUtilTest { - + @Test public void getEleTypeTest() { Method method = ReflectUtil.getMethod(TestClass.class, "getList"); Type type = TypeUtil.getReturnType(method); Assert.assertEquals("java.util.List", type.toString()); - + Type type2 = TypeUtil.getTypeArgument(type); Assert.assertEquals(String.class, type2); } - + @Test public void getParamTypeTest() { Method method = ReflectUtil.getMethod(TestClass.class, "intTest", Integer.class); Type type = TypeUtil.getParamType(method, 0); Assert.assertEquals(Integer.class, type); - + Type returnType = TypeUtil.getReturnType(method); Assert.assertEquals(Integer.class, returnType); } - + + @Test + public void getClasses() { + Method method = ReflectUtil.getMethod(Parent.class, "getLevel"); + Type returnType = TypeUtil.getReturnType(method); + Class clazz = TypeUtil.getClass(returnType); + Assert.assertEquals(Level1.class, clazz); + + method = ReflectUtil.getMethod(Level1.class, "getId"); + returnType = TypeUtil.getReturnType(method); + clazz = TypeUtil.getClass(returnType); + Assert.assertEquals(Object.class, clazz); + } + public static class TestClass { - public List getList(){ + public List getList() { return new ArrayList<>(); } - + public Integer intTest(Integer integer) { return 1; } + } @Test - public void getTypeArgumentTest(){ + public void getTypeArgumentTest() { // 测试不继承父类,而是实现泛型接口时是否可以获取成功。 final Type typeArgument = TypeUtil.getTypeArgument(IPService.class); Assert.assertEquals(String.class, typeArgument); @@ -59,25 +72,29 @@ public class TypeUtilTest { } @Test - public void getActualTypesTest(){ + public void getActualTypesTest() { // 测试多层级泛型参数是否能获取成功 - Type idType = TypeUtil.getActualType(Level3.class, - ReflectUtil.getField(Level3.class, "id")); + Type idType = TypeUtil.getActualType(Level3.class, ReflectUtil.getField(Level3.class, "id")); Assert.assertEquals(Long.class, idType); } - public static class Level3 extends Level2{ + public static class Level3 extends Level2 { } - public static class Level2 extends Level1{ + public static class Level2 extends Level1 { } @Data - public static class Level1{ + public static class Level1 { private T id; } + @Data + public static class Parent, B extends Long> { + private T level; + } + }