Skip to content

Commit 1a30252

Browse files
committed
ResolvableType.java.forRawClass(Class) supports isAssignableFrom(ResolvableType) as well
Issue: SPR-14648
1 parent e08b1b7 commit 1a30252

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ private boolean isAssignableFrom(ResolvableType other, Map<Type, Type> matchedBe
276276
WildcardBounds ourBounds = WildcardBounds.get(this);
277277
WildcardBounds typeBounds = WildcardBounds.get(other);
278278

279-
// In the from X is assignable to <? extends Number>
279+
// In the form X is assignable to <? extends Number>
280280
if (typeBounds != null) {
281281
return (ourBounds != null && ourBounds.isSameKind(typeBounds) &&
282282
ourBounds.isAssignableFrom(typeBounds.getBounds()));
@@ -937,7 +937,7 @@ public static ResolvableType forClass(Class<?> sourceClass) {
937937
* Return a {@link ResolvableType} for the specified {@link Class}, doing
938938
* assignability checks against the raw class only (analogous to
939939
* {@link Class#isAssignableFrom}, which this serves as a wrapper for.
940-
* For example: {@code ResolvableType.forClass(MyArrayList.class)}.
940+
* For example: {@code ResolvableType.forRawClass(List.class)}.
941941
* @param sourceClass the source class ({@code null} is semantically
942942
* equivalent to {@code Object.class} for typical use cases here}
943943
* @return a {@link ResolvableType} for the specified class
@@ -951,6 +951,11 @@ public static ResolvableType forRawClass(Class<?> sourceClass) {
951951
public boolean isAssignableFrom(Class<?> other) {
952952
return ClassUtils.isAssignable(getRawClass(), other);
953953
}
954+
@Override
955+
public boolean isAssignableFrom(ResolvableType other) {
956+
Class<?> otherClass = other.getRawClass();
957+
return (otherClass != null && ClassUtils.isAssignable(getRawClass(), otherClass));
958+
}
954959
};
955960
}
956961

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import java.util.HashMap;
3838
import java.util.List;
3939
import java.util.Map;
40+
import java.util.Set;
4041
import java.util.SortedSet;
4142
import java.util.TreeSet;
4243
import java.util.concurrent.Callable;
@@ -1084,7 +1085,6 @@ public void isAssignableFromForArrays() throws Exception {
10841085

10851086
@Test
10861087
public void isAssignableFromForWildcards() throws Exception {
1087-
10881088
ResolvableType object = ResolvableType.forClass(Object.class);
10891089
ResolvableType charSequence = ResolvableType.forClass(CharSequence.class);
10901090
ResolvableType string = ResolvableType.forClass(String.class);
@@ -1287,6 +1287,15 @@ public void testSpr12701() throws Exception {
12871287
assertThat(((ParameterizedType) type).getActualTypeArguments()[0], is(equalTo(String.class)));
12881288
}
12891289

1290+
@Test
1291+
public void testSpr14648() throws Exception {
1292+
ResolvableType collectionClass = ResolvableType.forRawClass(Collection.class);
1293+
ResolvableType setClass = ResolvableType.forRawClass(Set.class);
1294+
ResolvableType fromReturnType = ResolvableType.forMethodReturnType(Methods.class.getMethod("wildcardSet"));
1295+
assertTrue(collectionClass.isAssignableFrom(fromReturnType));
1296+
assertTrue(setClass.isAssignableFrom(fromReturnType));
1297+
}
1298+
12901299

12911300
private ResolvableType testSerialization(ResolvableType type) throws Exception {
12921301
ByteArrayOutputStream bos = new ByteArrayOutputStream();
@@ -1385,7 +1394,7 @@ static class TypedFields extends Fields<String> {
13851394
}
13861395

13871396

1388-
static interface Methods<T> {
1397+
interface Methods<T> {
13891398

13901399
List<CharSequence> charSequenceReturn();
13911400

@@ -1398,6 +1407,8 @@ static interface Methods<T> {
13981407
void typedParameter(T p);
13991408

14001409
T typedReturn();
1410+
1411+
Set<?> wildcardSet();
14011412
}
14021413

14031414

@@ -1453,7 +1464,7 @@ static class Assignment extends AssignmentBase<Object, CharSequence, String> {
14531464
}
14541465

14551466

1456-
static interface TypedMethods extends Methods<String> {
1467+
interface TypedMethods extends Methods<String> {
14571468
}
14581469

14591470

@@ -1526,19 +1537,19 @@ public class MyCollectionSuperclassType extends MySuperclassType<Collection<Stri
15261537
}
15271538

15281539

1529-
static interface Wildcard<T extends Number> extends List<T> {
1540+
interface Wildcard<T extends Number> extends List<T> {
15301541
}
15311542

15321543

1533-
static interface RawExtendsWildcard extends Wildcard {
1544+
interface RawExtendsWildcard extends Wildcard {
15341545
}
15351546

15361547

1537-
static interface VariableNameSwitch<V, K> extends MultiValueMap<K, V> {
1548+
interface VariableNameSwitch<V, K> extends MultiValueMap<K, V> {
15381549
}
15391550

15401551

1541-
static interface ListOfGenericArray extends List<List<String>[]> {
1552+
interface ListOfGenericArray extends List<List<String>[]> {
15421553
}
15431554

15441555

0 commit comments

Comments
 (0)