diff --git a/spring-core/src/main/java/org/springframework/core/ResolvableType.java b/spring-core/src/main/java/org/springframework/core/ResolvableType.java index 1c400202f3..dd8945cda9 100644 --- a/spring-core/src/main/java/org/springframework/core/ResolvableType.java +++ b/spring-core/src/main/java/org/springframework/core/ResolvableType.java @@ -1468,8 +1468,7 @@ public class ResolvableType implements Serializable { @Nullable public ResolvableType resolveVariable(TypeVariable variable) { for (int i = 0; i < this.variables.length; i++) { - if (ObjectUtils.nullSafeEquals(SerializableTypeWrapper.unwrap(this.variables[i]), - SerializableTypeWrapper.unwrap(variable))) { + if (ObjectUtils.nullSafeEquals(this.variables[i].getName(), variable.getName())) { return this.generics[i]; } } diff --git a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java index c36126a7b3..24ee9cdea4 100644 --- a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java +++ b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java @@ -1337,6 +1337,14 @@ public class ResolvableTypeTests { assertTrue(setClass.isAssignableFrom(fromReturnType)); } + @Test + public void testSpr16456() throws Exception { + ResolvableType genericType = ResolvableType.forField( + UnresolvedWithGenerics.class.getDeclaredField("set")).asCollection(); + ResolvableType type = ResolvableType.forClassWithGenerics(ArrayList.class, genericType.getGeneric()); + assertThat(type.resolveGeneric(), equalTo(Integer.class)); + } + private ResolvableType testSerialization(ResolvableType type) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); @@ -1637,4 +1645,10 @@ public class ResolvableTypeTests { public Collection> stuff; } + + public abstract class UnresolvedWithGenerics { + + Set set; + } + }