diff --git a/spring-core/src/test/java/org/springframework/core/GenericTypeResolverTests.java b/spring-core/src/test/java/org/springframework/core/GenericTypeResolverTests.java index 265e1e800d6..75a3c546b15 100644 --- a/spring-core/src/test/java/org/springframework/core/GenericTypeResolverTests.java +++ b/spring-core/src/test/java/org/springframework/core/GenericTypeResolverTests.java @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.Supplier; import org.junit.jupiter.api.Test; @@ -250,6 +251,15 @@ class GenericTypeResolverTests { assertThat(resolvedType).isEqualTo(InheritsDefaultMethod.ConcreteType.class); } + @Test + void resolveTypeFromNestedParameterizedType() { + Type resolvedType = resolveType(method(MyInterfaceType.class, "get").getGenericReturnType(), MyCollectionInterfaceType.class); + assertThat(resolvedType).isEqualTo(method(MyCollectionInterfaceType.class, "get").getGenericReturnType()); + + resolvedType = resolveType(method(MyInterfaceType.class, "get").getGenericReturnType(), MyOptionalInterfaceType.class); + assertThat(resolvedType).isEqualTo(method(MyOptionalInterfaceType.class, "get").getGenericReturnType()); + } + private static Method method(Class target, String methodName, Class... parameterTypes) { Method method = findMethod(target, methodName, parameterTypes); assertThat(method).describedAs(target.getName() + "#" + methodName).isNotNull(); @@ -258,12 +268,29 @@ class GenericTypeResolverTests { public interface MyInterfaceType { + default T get() { + return null; + } } public class MySimpleInterfaceType implements MyInterfaceType { } + public class MyParameterizedInterfaceType

implements MyInterfaceType> { + } + + public class MyOptionalInterfaceType extends MyParameterizedInterfaceType> { + @Override + public Collection> get() { + return super.get(); + } + } + public class MyCollectionInterfaceType implements MyInterfaceType> { + @Override + public Collection get() { + return MyInterfaceType.super.get(); + } } public abstract class MyAbstractType implements MyInterfaceType {