TypeUtil.getClass方法强转报错问题

This commit is contained in:
libin 2023-10-12 18:36:30 +08:00
parent 5d8a411453
commit 74452eb775
2 changed files with 39 additions and 19 deletions

View File

@ -40,7 +40,10 @@ public class TypeUtil {
} else if (type instanceof ParameterizedType) { } else if (type instanceof ParameterizedType) {
return (Class<?>) ((ParameterizedType) type).getRawType(); return (Class<?>) ((ParameterizedType) type).getRawType();
} else if (type instanceof TypeVariable) { } 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) { } else if (type instanceof WildcardType) {
final Type[] upperBounds = ((WildcardType) type).getUpperBounds(); final Type[] upperBounds = ((WildcardType) type).getUpperBounds();
if (upperBounds.length == 1) { if (upperBounds.length == 1) {

View File

@ -1,13 +1,12 @@
package cn.hutool.core.util; 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.Method;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import lombok.Data;
import org.junit.Assert;
import org.junit.Test;
public class TypeUtilTest { public class TypeUtilTest {
@ -31,6 +30,19 @@ public class TypeUtilTest {
Assert.assertEquals(Integer.class, returnType); 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 static class TestClass {
public List<String> getList() { public List<String> getList() {
return new ArrayList<>(); return new ArrayList<>();
@ -39,6 +51,7 @@ public class TypeUtilTest {
public Integer intTest(Integer integer) { public Integer intTest(Integer integer) {
return 1; return 1;
} }
} }
@Test @Test
@ -61,8 +74,7 @@ public class TypeUtilTest {
@Test @Test
public void getActualTypesTest() { public void getActualTypesTest() {
// 测试多层级泛型参数是否能获取成功 // 测试多层级泛型参数是否能获取成功
Type idType = TypeUtil.getActualType(Level3.class, Type idType = TypeUtil.getActualType(Level3.class, ReflectUtil.getField(Level3.class, "id"));
ReflectUtil.getField(Level3.class, "id"));
Assert.assertEquals(Long.class, idType); Assert.assertEquals(Long.class, idType);
} }
@ -80,4 +92,9 @@ public class TypeUtilTest {
private T id; private T id;
} }
@Data
public static class Parent<T extends Level1<B>, B extends Long> {
private T level;
}
} }