Skip to content

Commit c573eca

Browse files
committed
Fix ResolvableType raw class isAssignable checks (backport from 5.1.x)
Closes gh-23321
1 parent ed2659c commit c573eca

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

spring-core/src/main/java/org/springframework/core/ResolvableType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,7 @@ public boolean isAssignableFrom(Class<?> other) {
991991
}
992992
@Override
993993
public boolean isAssignableFrom(ResolvableType other) {
994-
Class<?> otherClass = other.getRawClass();
994+
Class<?> otherClass = other.resolve();
995995
return (otherClass != null && (clazz == null || ClassUtils.isAssignable(clazz, otherClass)));
996996
}
997997
};

spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2018 the original author or authors.
2+
* Copyright 2002-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -135,29 +135,41 @@ public void forRawClassWithNull() throws Exception {
135135
assertTrue(type.isAssignableFrom(String.class));
136136
}
137137

138+
@Test // gh-23321
139+
public void forRawClassAssignableFromTypeVariable() throws Exception {
140+
ResolvableType typeVariable = ResolvableType.forClass(ExtendsList.class).as(List.class).getGeneric();
141+
ResolvableType raw = ResolvableType.forRawClass(CharSequence.class);
142+
assertThat(raw.resolve(), equalTo(CharSequence.class));
143+
assertThat(typeVariable.resolve(), equalTo(CharSequence.class));
144+
assertTrue(raw.resolve().isAssignableFrom(typeVariable.resolve()));
145+
assertTrue(typeVariable.resolve().isAssignableFrom(raw.resolve()));
146+
assertTrue(raw.isAssignableFrom(typeVariable));
147+
assertTrue(typeVariable.isAssignableFrom(raw));
148+
}
149+
138150
@Test
139-
public void forInstanceMustNotBeNull() {
151+
public void forInstanceMustNotBeNull() throws Exception {
140152
this.thrown.expect(IllegalArgumentException.class);
141153
this.thrown.expectMessage("Instance must not be null");
142154
ResolvableType.forInstance(null);
143155
}
144156

145157
@Test
146-
public void forInstanceNoProvider() {
158+
public void forInstanceNoProvider() throws Exception {
147159
ResolvableType type = ResolvableType.forInstance(new Object());
148160
assertThat(type.getType(), equalTo(Object.class));
149161
assertThat(type.resolve(), equalTo(Object.class));
150162
}
151163

152164
@Test
153-
public void forInstanceProvider() {
165+
public void forInstanceProvider() throws Exception {
154166
ResolvableType type = ResolvableType.forInstance(new MyGenericInterfaceType<>(String.class));
155167
assertThat(type.getRawClass(), equalTo(MyGenericInterfaceType.class));
156168
assertThat(type.getGeneric().resolve(), equalTo(String.class));
157169
}
158170

159171
@Test
160-
public void forInstanceProviderNull() {
172+
public void forInstanceProviderNull() throws Exception {
161173
ResolvableType type = ResolvableType.forInstance(new MyGenericInterfaceType<String>(null));
162174
assertThat(type.getType(), equalTo(MyGenericInterfaceType.class));
163175
assertThat(type.resolve(), equalTo(MyGenericInterfaceType.class));
@@ -431,12 +443,8 @@ public void getInterfaces() throws Exception {
431443
interfaces.add(interfaceType.toString());
432444
}
433445
assertThat(interfaces.toString(), equalTo(
434-
"["
435-
+ "java.io.Serializable, "
436-
+ "java.lang.Cloneable, "
437-
+ "java.util.List<java.lang.CharSequence>, "
438-
+ "java.util.RandomAccess"
439-
+ "]"));
446+
"[java.io.Serializable, java.lang.Cloneable, " +
447+
"java.util.List<java.lang.CharSequence>, java.util.RandomAccess]"));
440448
}
441449

442450
@Test

0 commit comments

Comments
 (0)