Skip to content

Commit 5358cc0

Browse files
author
Phillip Webb
committed
Fix ResolvableType isAssignableFrom for <?>
Fix ResolvableType.isAssignableFrom to correctly deal with <?> style generics. Issue: SPR-10973
1 parent 501a1cb commit 5358cc0

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ private boolean isAssignableFrom(ResolvableType type, boolean checkingGeneric) {
138138
Assert.notNull(type, "Type must not be null");
139139

140140
// If we cannot resolve types, we are not assignable
141-
if (resolve() == null || type.resolve() == null) {
141+
if (this == NONE || type == NONE) {
142142
return false;
143143
}
144144

@@ -164,15 +164,16 @@ private boolean isAssignableFrom(ResolvableType type, boolean checkingGeneric) {
164164
}
165165

166166
// Main assignability check
167-
boolean rtn = resolve().isAssignableFrom(type.resolve());
167+
boolean rtn = resolve(Object.class).isAssignableFrom(type.resolve(Object.class));
168168

169169
// We need an exact type match for generics
170170
// List<CharSequence> is not assignable from List<String>
171-
rtn &= (!checkingGeneric || resolve().equals(type.resolve()));
171+
rtn &= (!checkingGeneric || resolve(Object.class).equals(type.resolve(Object.class)));
172172

173173
// Recursively check each generic
174174
for (int i = 0; i < getGenerics().length; i++) {
175-
rtn &= getGeneric(i).isAssignableFrom(type.as(resolve()).getGeneric(i), true);
175+
rtn &= getGeneric(i).isAssignableFrom(
176+
type.as(resolve(Object.class)).getGeneric(i), true);
176177
}
177178

178179
return rtn;

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@
5252
import static org.mockito.Matchers.*;
5353
import static org.mockito.Mockito.*;
5454

55-
// FIXME nested
56-
5755
/**
5856
* Tests for {@link ResolvableType}.
5957
*
@@ -822,8 +820,8 @@ public void isAssignableFromCannotBeResolved() throws Exception {
822820
ResolvableType objectType = ResolvableType.forClass(Object.class);
823821
ResolvableType unresolvableVariable = ResolvableType.forField(AssignmentBase.class.getField("o"));
824822
assertThat(unresolvableVariable.resolve(), nullValue());
825-
assertAssignable(objectType, unresolvableVariable).equalTo(false);
826-
assertAssignable(unresolvableVariable, objectType).equalTo(false);
823+
assertAssignable(objectType, unresolvableVariable).equalTo(true);
824+
assertAssignable(unresolvableVariable, objectType).equalTo(true);
827825
}
828826

829827
@Test
@@ -936,6 +934,7 @@ public void isAssignableFromForWildcards() throws Exception {
936934
ResolvableType object = ResolvableType.forClass(Object.class);
937935
ResolvableType charSequence = ResolvableType.forClass(CharSequence.class);
938936
ResolvableType string = ResolvableType.forClass(String.class);
937+
ResolvableType extendsAnon = ResolvableType.forField(AssignmentBase.class.getField("listAnon"), Assignment.class).getGeneric();
939938
ResolvableType extendsObject = ResolvableType.forField(AssignmentBase.class.getField("listxo"), Assignment.class).getGeneric();
940939
ResolvableType extendsCharSequence = ResolvableType.forField(AssignmentBase.class.getField("listxc"), Assignment.class).getGeneric();
941940
ResolvableType extendsString = ResolvableType.forField(AssignmentBase.class.getField("listxs"), Assignment.class).getGeneric();
@@ -972,6 +971,8 @@ public void isAssignableFromForWildcards() throws Exception {
972971
equalTo(false, true, true);
973972
assertAssignable(charSequence, extendsObject, extendsCharSequence, extendsString).
974973
equalTo(false, false, false);
974+
assertAssignable(extendsAnon, object, charSequence, string).
975+
equalTo(true, true, true);
975976

976977
// T <= ? super T
977978
assertAssignable(superCharSequence, object, charSequence, string).
@@ -1144,6 +1145,8 @@ static class AssignmentBase<O, C, S> {
11441145

11451146
public List<S> lists;
11461147

1148+
public List<?> listAnon;
1149+
11471150
public List<? extends O> listxo;
11481151

11491152
public List<? extends C> listxc;

0 commit comments

Comments
 (0)