Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,9 @@ else if (genericType instanceof ParameterizedType parameterizedType) {
else if (typeArgument instanceof ParameterizedType) {
generics[i] = ResolvableType.forType(resolveType(typeArgument, contextClass));
}
else if (typeArgument instanceof WildcardType) {
generics[i] = ResolvableType.forType(resolveType(typeArgument, contextClass));
}
else {
generics[i] = ResolvableType.forType(typeArgument);
}
Expand All @@ -203,6 +206,12 @@ else if (typeArgument instanceof ParameterizedType) {
}
}
}
else if (genericType instanceof WildcardType wildcardType) {
Type[] upperBounds = wildcardType.getUpperBounds();
if (upperBounds.length == 1) {
return resolveType(upperBounds[0], contextClass);
}
}
}
return genericType;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,16 @@ void resolveTypeFromNestedParameterizedType() {
assertThat(resolvedType).isEqualTo(method(MyOptionalInterfaceType.class, "get").getGenericReturnType());
}

@Test
void resolveWildcardTypeArgument() {
Type genericReturnType = method(WildcardService.class, "findAll").getGenericReturnType();
Type resolvedType = resolveType(genericReturnType, PersonWildcardService.class);
assertThat(resolvedType).isInstanceOf(ParameterizedType.class);
ParameterizedType parameterizedType = (ParameterizedType) resolvedType;
assertThat(parameterizedType.getRawType()).isEqualTo(List.class);
assertThat(parameterizedType.getActualTypeArguments()[0]).isEqualTo(String.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 @@ -504,4 +514,17 @@ static class ConcreteType implements InterfaceWithDefaultMethod.AbstractType {
}
}

interface WildcardService<T> {

List<? extends T> findAll();
}

static class PersonWildcardService implements WildcardService<String> {

@Override
public List<? extends String> findAll() {
return List.of();
}
}

}