From 1a30252fc902f035ab200d59141136ad4a2d61ef Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 31 Aug 2016 14:45:22 +0200 Subject: [PATCH] ResolvableType.java.forRawClass(Class) supports isAssignableFrom(ResolvableType) as well Issue: SPR-14648 --- .../springframework/core/ResolvableType.java | 9 +++++-- .../core/ResolvableTypeTests.java | 25 +++++++++++++------ 2 files changed, 25 insertions(+), 9 deletions(-) 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 2302b88d23..e3bdd698c7 100644 --- a/spring-core/src/main/java/org/springframework/core/ResolvableType.java +++ b/spring-core/src/main/java/org/springframework/core/ResolvableType.java @@ -276,7 +276,7 @@ public class ResolvableType implements Serializable { WildcardBounds ourBounds = WildcardBounds.get(this); WildcardBounds typeBounds = WildcardBounds.get(other); - // In the from X is assignable to + // In the form X is assignable to if (typeBounds != null) { return (ourBounds != null && ourBounds.isSameKind(typeBounds) && ourBounds.isAssignableFrom(typeBounds.getBounds())); @@ -937,7 +937,7 @@ public class ResolvableType implements Serializable { * Return a {@link ResolvableType} for the specified {@link Class}, doing * assignability checks against the raw class only (analogous to * {@link Class#isAssignableFrom}, which this serves as a wrapper for. - * For example: {@code ResolvableType.forClass(MyArrayList.class)}. + * For example: {@code ResolvableType.forRawClass(List.class)}. * @param sourceClass the source class ({@code null} is semantically * equivalent to {@code Object.class} for typical use cases here} * @return a {@link ResolvableType} for the specified class @@ -951,6 +951,11 @@ public class ResolvableType implements Serializable { public boolean isAssignableFrom(Class other) { return ClassUtils.isAssignable(getRawClass(), other); } + @Override + public boolean isAssignableFrom(ResolvableType other) { + Class otherClass = other.getRawClass(); + return (otherClass != null && ClassUtils.isAssignable(getRawClass(), 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 3dfaeee065..9ea4c209b6 100644 --- a/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java +++ b/spring-core/src/test/java/org/springframework/core/ResolvableTypeTests.java @@ -37,6 +37,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.Callable; @@ -1084,7 +1085,6 @@ public class ResolvableTypeTests { @Test public void isAssignableFromForWildcards() throws Exception { - ResolvableType object = ResolvableType.forClass(Object.class); ResolvableType charSequence = ResolvableType.forClass(CharSequence.class); ResolvableType string = ResolvableType.forClass(String.class); @@ -1287,6 +1287,15 @@ public class ResolvableTypeTests { assertThat(((ParameterizedType) type).getActualTypeArguments()[0], is(equalTo(String.class))); } + @Test + public void testSpr14648() throws Exception { + ResolvableType collectionClass = ResolvableType.forRawClass(Collection.class); + ResolvableType setClass = ResolvableType.forRawClass(Set.class); + ResolvableType fromReturnType = ResolvableType.forMethodReturnType(Methods.class.getMethod("wildcardSet")); + assertTrue(collectionClass.isAssignableFrom(fromReturnType)); + assertTrue(setClass.isAssignableFrom(fromReturnType)); + } + private ResolvableType testSerialization(ResolvableType type) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); @@ -1385,7 +1394,7 @@ public class ResolvableTypeTests { } - static interface Methods { + interface Methods { List charSequenceReturn(); @@ -1398,6 +1407,8 @@ public class ResolvableTypeTests { void typedParameter(T p); T typedReturn(); + + Set wildcardSet(); } @@ -1453,7 +1464,7 @@ public class ResolvableTypeTests { } - static interface TypedMethods extends Methods { + interface TypedMethods extends Methods { } @@ -1526,19 +1537,19 @@ public class ResolvableTypeTests { } - static interface Wildcard extends List { + interface Wildcard extends List { } - static interface RawExtendsWildcard extends Wildcard { + interface RawExtendsWildcard extends Wildcard { } - static interface VariableNameSwitch extends MultiValueMap { + interface VariableNameSwitch extends MultiValueMap { } - static interface ListOfGenericArray extends List[]> { + interface ListOfGenericArray extends List[]> { } -- GitLab