Skip to content

Commit 03cce13

Browse files
committed
Merge branch '6.2.x'
2 parents 7f02011 + 3bb4795 commit 03cce13

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

Diff for: spring-core/src/main/java/org/springframework/core/GenericTypeResolver.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ public static Type resolveType(Type genericType, @Nullable Class<?> contextClass
156156
if (genericType instanceof TypeVariable<?> typeVariable) {
157157
ResolvableType resolvedTypeVariable = resolveVariable(
158158
typeVariable, ResolvableType.forClass(contextClass));
159+
if (resolvedTypeVariable == ResolvableType.NONE) {
160+
resolvedTypeVariable = ResolvableType.forVariableBounds(typeVariable);
161+
}
159162
if (resolvedTypeVariable != ResolvableType.NONE) {
160163
Class<?> resolved = resolvedTypeVariable.resolve();
161164
if (resolved != null) {
@@ -173,6 +176,9 @@ else if (genericType instanceof ParameterizedType parameterizedType) {
173176
Type typeArgument = typeArguments[i];
174177
if (typeArgument instanceof TypeVariable<?> typeVariable) {
175178
ResolvableType resolvedTypeArgument = resolveVariable(typeVariable, contextType);
179+
if (resolvedTypeArgument == ResolvableType.NONE) {
180+
resolvedTypeArgument = ResolvableType.forVariableBounds(typeVariable);
181+
}
176182
if (resolvedTypeArgument != ResolvableType.NONE) {
177183
generics[i] = resolvedTypeArgument;
178184
}
@@ -226,7 +232,7 @@ private static ResolvableType resolveVariable(TypeVariable<?> typeVariable, Reso
226232
return resolvedType;
227233
}
228234
}
229-
return ResolvableType.forVariableBounds(typeVariable);
235+
return ResolvableType.NONE;
230236
}
231237

232238
/**

Diff for: spring-core/src/test/java/org/springframework/core/GenericTypeResolverTests.java

+23
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,13 @@ void resolveTypeWithUnresolvableElement() {
243243
assertThat(resolvedType.toString()).isEqualTo("java.util.List<E>");
244244
}
245245

246+
@Test
247+
void resolveTypeFromGenericDefaultMethod() {
248+
Type type = method(InterfaceWithDefaultMethod.class, "get", InheritsDefaultMethod.AbstractType.class).getGenericParameterTypes()[0];
249+
Type resolvedType = resolveType(type, InheritsDefaultMethod.class);
250+
assertThat(resolvedType).isEqualTo(InheritsDefaultMethod.ConcreteType.class);
251+
}
252+
246253
private static Method method(Class<?> target, String methodName, Class<?>... parameterTypes) {
247254
Method method = findMethod(target, methodName, parameterTypes);
248255
assertThat(method).describedAs(target.getName() + "#" + methodName).isNotNull();
@@ -454,4 +461,20 @@ List<T> get() {
454461
}
455462
}
456463

464+
public interface InterfaceWithDefaultMethod<T extends InheritsDefaultMethod.AbstractType> {
465+
466+
default String get(T input) {
467+
throw new UnsupportedOperationException();
468+
}
469+
470+
interface AbstractType {
471+
}
472+
}
473+
474+
public static class InheritsDefaultMethod implements InterfaceWithDefaultMethod<InheritsDefaultMethod.ConcreteType> {
475+
476+
static class ConcreteType implements AbstractType {
477+
}
478+
}
479+
457480
}

0 commit comments

Comments
 (0)