Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2a04d9e

Browse files
author
Ahmed El amraouiyine
committed
Fix GenericTypeResolver type-variable collisions
Signed-off-by: Ahmed El amraouiyine <[email protected]>
1 parent 30287d7 commit 2a04d9e

2 files changed

Lines changed: 27 additions & 1 deletion

File tree

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ else if (typeArgument instanceof ParameterizedType) {
209209

210210
private static ResolvableType resolveVariable(TypeVariable<?> typeVariable, ResolvableType contextType) {
211211
ResolvableType resolvedType;
212-
if (contextType.hasGenerics()) {
212+
if (contextType.hasGenerics() && declaresTypeVariable(typeVariable, contextType)) {
213213
ResolvableType.VariableResolver variableResolver = contextType.asVariableResolver();
214214
if (variableResolver == null) {
215215
return ResolvableType.NONE;
@@ -239,6 +239,11 @@ private static ResolvableType resolveVariable(TypeVariable<?> typeVariable, Reso
239239
return ResolvableType.NONE;
240240
}
241241

242+
private static boolean declaresTypeVariable(TypeVariable<?> typeVariable, ResolvableType contextType) {
243+
TypeVariable<?> variableToCompare = SerializableTypeWrapper.unwrap(typeVariable);
244+
return (variableToCompare.getGenericDeclaration() == contextType.resolve());
245+
}
246+
242247
/**
243248
* Resolve the specified generic type against the given TypeVariable map.
244249
* <p>Used by Spring Data.

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,14 @@ void resolveTypeFromGenericDefaultMethod() {
251251
assertThat(resolvedType).isEqualTo(InheritsDefaultMethod.ConcreteType.class);
252252
}
253253

254+
@Test // gh-36890
255+
void resolveTypeVariableCollisionAcrossInterfaces() {
256+
Type type = method(Create.class, "create", Object.class).getGenericParameterTypes()[0];
257+
Type resolvedType = resolveType(type, Controller.class);
258+
259+
assertThat(resolvedType).isEqualTo(Long.class);
260+
}
261+
254262
@Test
255263
void resolveTypeFromNestedParameterizedType() {
256264
Type resolvedType = resolveType(method(MyInterfaceType.class, "get").getGenericReturnType(), MyCollectionInterfaceType.class);
@@ -504,4 +512,17 @@ static class ConcreteType implements InterfaceWithDefaultMethod.AbstractType {
504512
}
505513
}
506514

515+
interface Search<I, O> {
516+
}
517+
518+
interface Create<I, O> {
519+
520+
default O create(I body) {
521+
return null;
522+
}
523+
}
524+
525+
static class Controller implements Search<String, Long>, Create<Long, Long> {
526+
}
527+
507528
}

0 commit comments

Comments
 (0)