Skip to content

Commit 197dbff

Browse files
committed
Support variable resolution of wildcard types
Includes cleanup of "varaible" typos in ResolvableTypeTests. Closes gh-24150
1 parent 5341e77 commit 197dbff

File tree

2 files changed

+22
-21
lines changed

2 files changed

+22
-21
lines changed

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,12 @@ private ResolvableType resolveVariable(TypeVariable<?> variable) {
872872
return forType(ownerType, this.variableResolver).resolveVariable(variable);
873873
}
874874
}
875+
if (this.type instanceof WildcardType) {
876+
ResolvableType resolved = resolveType().resolveVariable(variable);
877+
if (resolved != null) {
878+
return resolved;
879+
}
880+
}
875881
if (this.variableResolver != null) {
876882
return this.variableResolver.resolveVariable(variable);
877883
}
@@ -997,7 +1003,7 @@ public static ResolvableType forClass(@Nullable Class<?> clazz) {
9971003
* {@link Class#isAssignableFrom}, which this serves as a wrapper for.
9981004
* For example: {@code ResolvableType.forRawClass(List.class)}.
9991005
* @param clazz the class to introspect ({@code null} is semantically
1000-
* equivalent to {@code Object.class} for typical use cases here}
1006+
* equivalent to {@code Object.class} for typical use cases here)
10011007
* @return a {@link ResolvableType} for the specified class
10021008
* @since 4.2
10031009
* @see #forClass(Class)
@@ -1485,10 +1491,10 @@ public TypeVariablesVariableResolver(TypeVariable<?>[] variables, ResolvableType
14851491
@Override
14861492
@Nullable
14871493
public ResolvableType resolveVariable(TypeVariable<?> variable) {
1494+
TypeVariable<?> variableToCompare = SerializableTypeWrapper.unwrap(variable);
14881495
for (int i = 0; i < this.variables.length; i++) {
1489-
TypeVariable<?> v1 = SerializableTypeWrapper.unwrap(this.variables[i]);
1490-
TypeVariable<?> v2 = SerializableTypeWrapper.unwrap(variable);
1491-
if (ObjectUtils.nullSafeEquals(v1, v2)) {
1496+
TypeVariable<?> resolvedVariable = SerializableTypeWrapper.unwrap(this.variables[i]);
1497+
if (ObjectUtils.nullSafeEquals(resolvedVariable, variableToCompare)) {
14921498
return this.generics[i];
14931499
}
14941500
}

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

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -684,53 +684,46 @@ public void doesResolveFromOuterOwner() throws Exception {
684684

685685
@Test
686686
public void resolveBoundedTypeVariableResult() throws Exception {
687-
ResolvableType type = ResolvableType.forMethodReturnType(Methods.class.getMethod("boundedTypeVaraibleResult"));
687+
ResolvableType type = ResolvableType.forMethodReturnType(Methods.class.getMethod("boundedTypeVariableResult"));
688688
assertThat(type.resolve(), equalTo((Class) CharSequence.class));
689689
}
690690

691691
@Test
692-
public void resolveVariableNotFound() throws Exception {
693-
ResolvableType type = ResolvableType.forMethodReturnType(Methods.class.getMethod("typedReturn"));
694-
assertThat(type.resolve(), nullValue());
692+
public void resolveBoundedTypeVariableWildcardResult() throws Exception {
693+
ResolvableType type = ResolvableType.forMethodReturnType(Methods.class.getMethod("boundedTypeVariableWildcardResult"));
694+
assertThat(type.getGeneric(1).asCollection().resolveGeneric(), equalTo((Class) CharSequence.class));
695695
}
696696

697697
@Test
698-
public void resolveTypeVaraibleFromMethodReturn() throws Exception {
698+
public void resolveVariableNotFound() throws Exception {
699699
ResolvableType type = ResolvableType.forMethodReturnType(Methods.class.getMethod("typedReturn"));
700700
assertThat(type.resolve(), nullValue());
701701
}
702702

703703
@Test
704-
public void resolveTypeVaraibleFromMethodReturnWithInstanceClass() throws Exception {
705-
ResolvableType type = ResolvableType.forMethodReturnType(
706-
Methods.class.getMethod("typedReturn"), TypedMethods.class);
707-
assertThat(type.resolve(), equalTo((Class) String.class));
708-
}
709-
710-
@Test
711-
public void resolveTypeVaraibleFromSimpleInterfaceType() {
704+
public void resolveTypeVariableFromSimpleInterfaceType() {
712705
ResolvableType type = ResolvableType.forClass(
713706
MySimpleInterfaceType.class).as(MyInterfaceType.class);
714707
assertThat(type.resolveGeneric(), equalTo((Class) String.class));
715708
}
716709

717710
@Test
718-
public void resolveTypeVaraibleFromSimpleCollectionInterfaceType() {
711+
public void resolveTypeVariableFromSimpleCollectionInterfaceType() {
719712
ResolvableType type = ResolvableType.forClass(
720713
MyCollectionInterfaceType.class).as(MyInterfaceType.class);
721714
assertThat(type.resolveGeneric(), equalTo((Class) Collection.class));
722715
assertThat(type.resolveGeneric(0, 0), equalTo((Class) String.class));
723716
}
724717

725718
@Test
726-
public void resolveTypeVaraibleFromSimpleSuperclassType() {
719+
public void resolveTypeVariableFromSimpleSuperclassType() {
727720
ResolvableType type = ResolvableType.forClass(
728721
MySimpleSuperclassType.class).as(MySuperclassType.class);
729722
assertThat(type.resolveGeneric(), equalTo((Class) String.class));
730723
}
731724

732725
@Test
733-
public void resolveTypeVaraibleFromSimpleCollectionSuperclassType() {
726+
public void resolveTypeVariableFromSimpleCollectionSuperclassType() {
734727
ResolvableType type = ResolvableType.forClass(
735728
MyCollectionSuperclassType.class).as(MySuperclassType.class);
736729
assertThat(type.resolveGeneric(), equalTo((Class) Collection.class));
@@ -1459,7 +1452,9 @@ interface Methods<T> {
14591452

14601453
void charSequenceParameter(List<CharSequence> cs);
14611454

1462-
<R extends CharSequence & Serializable> R boundedTypeVaraibleResult();
1455+
<R extends CharSequence & Serializable> R boundedTypeVariableResult();
1456+
1457+
Map<String, ? extends List<? extends CharSequence>> boundedTypeVariableWildcardResult();
14631458

14641459
void nested(Map<Map<String, Integer>, Map<Byte, Long>> p);
14651460

0 commit comments

Comments
 (0)