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 e633b0ecddb..469e934f131 100644 --- a/spring-core/src/main/java/org/springframework/core/ResolvableType.java +++ b/spring-core/src/main/java/org/springframework/core/ResolvableType.java @@ -1015,7 +1015,7 @@ public class ResolvableType implements Serializable { } @Override public boolean isAssignableFrom(ResolvableType other) { - Class otherClass = other.getRawClass(); + Class otherClass = other.resolve(); return (otherClass != null && (clazz == null || ClassUtils.isAssignable(clazz, otherClass))); } }; 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 f44c393915b..f4a4490da25 100644 --- a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java +++ b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java @@ -135,6 +135,18 @@ public class ResolvableTypeTests { assertTrue(type.isAssignableFrom(String.class)); } + @Test + public void forRawClassAssignableFromTypeVariable() { // gh-23321 + ResolvableType typeVariable = ResolvableType.forClass(ExtendsList.class).as(List.class).getGeneric(); + ResolvableType raw = ResolvableType.forRawClass(CharSequence.class); + assertThat(raw.resolve()).isEqualTo(CharSequence.class); + assertThat(typeVariable.resolve()).isEqualTo(CharSequence.class); + assertThat(raw.resolve().isAssignableFrom(typeVariable.resolve())).isTrue(); + assertThat(typeVariable.resolve().isAssignableFrom(raw.resolve())).isTrue(); + assertThat(raw.isAssignableFrom(typeVariable)).isTrue(); + assertThat(typeVariable.isAssignableFrom(raw)).isTrue(); + } + @Test public void forInstanceMustNotBeNull() { this.thrown.expect(IllegalArgumentException.class);