提交 1a30252f 编写于 作者: J Juergen Hoeller

ResolvableType.java.forRawClass(Class) supports isAssignableFrom(ResolvableType) as well

Issue: SPR-14648
上级 e08b1b75
...@@ -276,7 +276,7 @@ public class ResolvableType implements Serializable { ...@@ -276,7 +276,7 @@ public class ResolvableType implements Serializable {
WildcardBounds ourBounds = WildcardBounds.get(this); WildcardBounds ourBounds = WildcardBounds.get(this);
WildcardBounds typeBounds = WildcardBounds.get(other); WildcardBounds typeBounds = WildcardBounds.get(other);
// In the from X is assignable to <? extends Number> // In the form X is assignable to <? extends Number>
if (typeBounds != null) { if (typeBounds != null) {
return (ourBounds != null && ourBounds.isSameKind(typeBounds) && return (ourBounds != null && ourBounds.isSameKind(typeBounds) &&
ourBounds.isAssignableFrom(typeBounds.getBounds())); ourBounds.isAssignableFrom(typeBounds.getBounds()));
...@@ -937,7 +937,7 @@ public class ResolvableType implements Serializable { ...@@ -937,7 +937,7 @@ public class ResolvableType implements Serializable {
* Return a {@link ResolvableType} for the specified {@link Class}, doing * Return a {@link ResolvableType} for the specified {@link Class}, doing
* assignability checks against the raw class only (analogous to * assignability checks against the raw class only (analogous to
* {@link Class#isAssignableFrom}, which this serves as a wrapper for. * {@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 * @param sourceClass the source class ({@code null} is semantically
* equivalent to {@code Object.class} for typical use cases here} * equivalent to {@code Object.class} for typical use cases here}
* @return a {@link ResolvableType} for the specified class * @return a {@link ResolvableType} for the specified class
...@@ -951,6 +951,11 @@ public class ResolvableType implements Serializable { ...@@ -951,6 +951,11 @@ public class ResolvableType implements Serializable {
public boolean isAssignableFrom(Class<?> other) { public boolean isAssignableFrom(Class<?> other) {
return ClassUtils.isAssignable(getRawClass(), other); return ClassUtils.isAssignable(getRawClass(), other);
} }
@Override
public boolean isAssignableFrom(ResolvableType other) {
Class<?> otherClass = other.getRawClass();
return (otherClass != null && ClassUtils.isAssignable(getRawClass(), otherClass));
}
}; };
} }
......
...@@ -37,6 +37,7 @@ import java.util.Collections; ...@@ -37,6 +37,7 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.SortedSet; import java.util.SortedSet;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
...@@ -1084,7 +1085,6 @@ public class ResolvableTypeTests { ...@@ -1084,7 +1085,6 @@ public class ResolvableTypeTests {
@Test @Test
public void isAssignableFromForWildcards() throws Exception { public void isAssignableFromForWildcards() throws Exception {
ResolvableType object = ResolvableType.forClass(Object.class); ResolvableType object = ResolvableType.forClass(Object.class);
ResolvableType charSequence = ResolvableType.forClass(CharSequence.class); ResolvableType charSequence = ResolvableType.forClass(CharSequence.class);
ResolvableType string = ResolvableType.forClass(String.class); ResolvableType string = ResolvableType.forClass(String.class);
...@@ -1287,6 +1287,15 @@ public class ResolvableTypeTests { ...@@ -1287,6 +1287,15 @@ public class ResolvableTypeTests {
assertThat(((ParameterizedType) type).getActualTypeArguments()[0], is(equalTo(String.class))); 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 { private ResolvableType testSerialization(ResolvableType type) throws Exception {
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream();
...@@ -1385,7 +1394,7 @@ public class ResolvableTypeTests { ...@@ -1385,7 +1394,7 @@ public class ResolvableTypeTests {
} }
static interface Methods<T> { interface Methods<T> {
List<CharSequence> charSequenceReturn(); List<CharSequence> charSequenceReturn();
...@@ -1398,6 +1407,8 @@ public class ResolvableTypeTests { ...@@ -1398,6 +1407,8 @@ public class ResolvableTypeTests {
void typedParameter(T p); void typedParameter(T p);
T typedReturn(); T typedReturn();
Set<?> wildcardSet();
} }
...@@ -1453,7 +1464,7 @@ public class ResolvableTypeTests { ...@@ -1453,7 +1464,7 @@ public class ResolvableTypeTests {
} }
static interface TypedMethods extends Methods<String> { interface TypedMethods extends Methods<String> {
} }
...@@ -1526,19 +1537,19 @@ public class ResolvableTypeTests { ...@@ -1526,19 +1537,19 @@ public class ResolvableTypeTests {
} }
static interface Wildcard<T extends Number> extends List<T> { interface Wildcard<T extends Number> extends List<T> {
} }
static interface RawExtendsWildcard extends Wildcard { interface RawExtendsWildcard extends Wildcard {
} }
static interface VariableNameSwitch<V, K> extends MultiValueMap<K, V> { interface VariableNameSwitch<V, K> extends MultiValueMap<K, V> {
} }
static interface ListOfGenericArray extends List<List<String>[]> { interface ListOfGenericArray extends List<List<String>[]> {
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册