Skip to content

Commit

Permalink
Merge branch '6.2.x'
Browse files Browse the repository at this point in the history
  • Loading branch information
jhoeller committed Feb 27, 2025
2 parents 7f02011 + 3bb4795 commit 03cce13
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,9 @@ public static Type resolveType(Type genericType, @Nullable Class<?> contextClass
if (genericType instanceof TypeVariable<?> typeVariable) {
ResolvableType resolvedTypeVariable = resolveVariable(
typeVariable, ResolvableType.forClass(contextClass));
if (resolvedTypeVariable == ResolvableType.NONE) {
resolvedTypeVariable = ResolvableType.forVariableBounds(typeVariable);
}
if (resolvedTypeVariable != ResolvableType.NONE) {
Class<?> resolved = resolvedTypeVariable.resolve();
if (resolved != null) {
Expand All @@ -173,6 +176,9 @@ else if (genericType instanceof ParameterizedType parameterizedType) {
Type typeArgument = typeArguments[i];
if (typeArgument instanceof TypeVariable<?> typeVariable) {
ResolvableType resolvedTypeArgument = resolveVariable(typeVariable, contextType);
if (resolvedTypeArgument == ResolvableType.NONE) {
resolvedTypeArgument = ResolvableType.forVariableBounds(typeVariable);
}
if (resolvedTypeArgument != ResolvableType.NONE) {
generics[i] = resolvedTypeArgument;
}
Expand Down Expand Up @@ -226,7 +232,7 @@ private static ResolvableType resolveVariable(TypeVariable<?> typeVariable, Reso
return resolvedType;
}
}
return ResolvableType.forVariableBounds(typeVariable);
return ResolvableType.NONE;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,13 @@ void resolveTypeWithUnresolvableElement() {
assertThat(resolvedType.toString()).isEqualTo("java.util.List<E>");
}

@Test
void resolveTypeFromGenericDefaultMethod() {
Type type = method(InterfaceWithDefaultMethod.class, "get", InheritsDefaultMethod.AbstractType.class).getGenericParameterTypes()[0];
Type resolvedType = resolveType(type, InheritsDefaultMethod.class);
assertThat(resolvedType).isEqualTo(InheritsDefaultMethod.ConcreteType.class);
}

private static Method method(Class<?> target, String methodName, Class<?>... parameterTypes) {
Method method = findMethod(target, methodName, parameterTypes);
assertThat(method).describedAs(target.getName() + "#" + methodName).isNotNull();
Expand Down Expand Up @@ -454,4 +461,20 @@ List<T> get() {
}
}

public interface InterfaceWithDefaultMethod<T extends InheritsDefaultMethod.AbstractType> {

default String get(T input) {
throw new UnsupportedOperationException();
}

interface AbstractType {
}
}

public static class InheritsDefaultMethod implements InterfaceWithDefaultMethod<InheritsDefaultMethod.ConcreteType> {

static class ConcreteType implements AbstractType {
}
}

}

0 comments on commit 03cce13

Please sign in to comment.