1818
1919import java .io .Serializable ;
2020import java .lang .reflect .Method ;
21+ import java .lang .reflect .ParameterizedType ;
2122import java .lang .reflect .Type ;
2223import java .lang .reflect .TypeVariable ;
2324import java .util .Collection ;
2425import java .util .HashMap ;
2526import java .util .List ;
2627import java .util .Map ;
28+ import java .util .function .Supplier ;
2729
2830import org .junit .jupiter .api .Test ;
2931
3032import static org .assertj .core .api .Assertions .assertThat ;
3133import static org .springframework .core .GenericTypeResolver .getTypeVariableMap ;
34+ import static org .springframework .core .GenericTypeResolver .resolveParameterType ;
35+ import static org .springframework .core .GenericTypeResolver .resolveReturnType ;
3236import static org .springframework .core .GenericTypeResolver .resolveReturnTypeArgument ;
3337import static org .springframework .core .GenericTypeResolver .resolveType ;
3438import static org .springframework .core .GenericTypeResolver .resolveTypeArgument ;
39+ import static org .springframework .core .GenericTypeResolver .resolveTypeArguments ;
3540import static org .springframework .util .ReflectionUtils .findMethod ;
3641
3742/**
@@ -106,25 +111,25 @@ void boundParameterizedType() {
106111 void testGetTypeVariableMap () {
107112 Map <TypeVariable , Type > map ;
108113
109- map = GenericTypeResolver . getTypeVariableMap (MySimpleInterfaceType .class );
114+ map = getTypeVariableMap (MySimpleInterfaceType .class );
110115 assertThat (map .toString ()).isEqualTo ("{T=class java.lang.String}" );
111116
112- map = GenericTypeResolver . getTypeVariableMap (MyCollectionInterfaceType .class );
117+ map = getTypeVariableMap (MyCollectionInterfaceType .class );
113118 assertThat (map .toString ()).isEqualTo ("{T=java.util.Collection<java.lang.String>}" );
114119
115- map = GenericTypeResolver . getTypeVariableMap (MyCollectionSuperclassType .class );
120+ map = getTypeVariableMap (MyCollectionSuperclassType .class );
116121 assertThat (map .toString ()).isEqualTo ("{T=java.util.Collection<java.lang.String>}" );
117122
118- map = GenericTypeResolver . getTypeVariableMap (MySimpleTypeWithMethods .class );
123+ map = getTypeVariableMap (MySimpleTypeWithMethods .class );
119124 assertThat (map .toString ()).isEqualTo ("{T=class java.lang.Integer}" );
120125
121- map = GenericTypeResolver . getTypeVariableMap (TopLevelClass .class );
126+ map = getTypeVariableMap (TopLevelClass .class );
122127 assertThat (map .toString ()).isEqualTo ("{}" );
123128
124- map = GenericTypeResolver . getTypeVariableMap (TypedTopLevelClass .class );
129+ map = getTypeVariableMap (TypedTopLevelClass .class );
125130 assertThat (map .toString ()).isEqualTo ("{T=class java.lang.Integer}" );
126131
127- map = GenericTypeResolver . getTypeVariableMap (TypedTopLevelClass .TypedNested .class );
132+ map = getTypeVariableMap (TypedTopLevelClass .TypedNested .class );
128133 assertThat (map ).hasSize (2 );
129134 Type t = null ;
130135 Type x = null ;
@@ -142,19 +147,19 @@ void testGetTypeVariableMap() {
142147
143148 @ Test
144149 void resolveTypeArgumentsOfAbstractType () {
145- Class <?>[] resolved = GenericTypeResolver . resolveTypeArguments (MyConcreteType .class , MyAbstractType .class );
150+ Class <?>[] resolved = resolveTypeArguments (MyConcreteType .class , MyAbstractType .class );
146151 assertThat (resolved ).containsExactly (Character .class );
147152 }
148153
149154 @ Test // SPR-11030
150155 void getGenericsCannotBeResolved () {
151- Class <?>[] resolved = GenericTypeResolver . resolveTypeArguments (List .class , Iterable .class );
156+ Class <?>[] resolved = resolveTypeArguments (List .class , Iterable .class );
152157 assertThat (resolved ).isNull ();
153158 }
154159
155160 @ Test // SPR-11052
156161 void getRawMapTypeCannotBeResolved () {
157- Class <?>[] resolved = GenericTypeResolver . resolveTypeArguments (Map .class , Map .class );
162+ Class <?>[] resolved = resolveTypeArguments (Map .class , Map .class );
158163 assertThat (resolved ).isNull ();
159164 }
160165
@@ -163,26 +168,38 @@ void getRawMapTypeCannotBeResolved() {
163168 void getGenericsOnArrayFromParamCannotBeResolved () throws Exception {
164169 MethodParameter methodParameter = MethodParameter .forExecutable (
165170 WithArrayBase .class .getDeclaredMethod ("array" , Object [].class ), 0 );
166- Class <?> resolved = GenericTypeResolver . resolveParameterType (methodParameter , WithArray .class );
171+ Class <?> resolved = resolveParameterType (methodParameter , WithArray .class );
167172 assertThat (resolved ).isEqualTo (Object [].class );
168173 }
169174
170175 @ Test // SPR-11044
171176 void getGenericsOnArrayFromReturnCannotBeResolved () throws Exception {
172- Class <?> resolved = GenericTypeResolver . resolveReturnType (
177+ Class <?> resolved = resolveReturnType (
173178 WithArrayBase .class .getDeclaredMethod ("array" , Object [].class ), WithArray .class );
174179 assertThat (resolved ).isEqualTo (Object [].class );
175180 }
176181
177182 @ Test // SPR-11763
178183 void resolveIncompleteTypeVariables () {
179- Class <?>[] resolved = GenericTypeResolver . resolveTypeArguments (IdFixingRepository .class , Repository .class );
184+ Class <?>[] resolved = resolveTypeArguments (IdFixingRepository .class , Repository .class );
180185 assertThat (resolved ).isNotNull ();
181186 assertThat (resolved ).hasSize (2 );
182187 assertThat (resolved [0 ]).isEqualTo (Object .class );
183188 assertThat (resolved [1 ]).isEqualTo (Long .class );
184189 }
185190
191+ @ Test // gh-34386
192+ void resolveVariableNameChange () {
193+ Type resolved = resolveType (Repository .class .getTypeParameters ()[0 ], ConcreteRepository .class );
194+ assertThat (resolved ).isEqualTo (String .class );
195+ Method method = method (Repository .class ,"store" , Supplier .class );
196+ resolved = resolveType (method .getGenericParameterTypes ()[0 ], ConcreteRepository .class );
197+ assertThat (resolved ).isInstanceOf (ParameterizedType .class );
198+ ParameterizedType pt = (ParameterizedType ) resolved ;
199+ assertThat (pt .getRawType ()).isEqualTo (Supplier .class );
200+ assertThat (pt .getActualTypeArguments ()[0 ]).isEqualTo (String .class );
201+ }
202+
186203 @ Test
187204 void resolvePartiallySpecializedTypeVariables () {
188205 Type resolved = resolveType (BiGenericClass .class .getTypeParameters ()[0 ], TypeFixedBiGenericClass .class );
@@ -398,9 +415,15 @@ abstract static class WithArray<T> extends WithArrayBase<T> {
398415 }
399416
400417 interface Repository <T , ID extends Serializable > {
418+
419+ default void store (Supplier <T > t ) {
420+ }
421+ }
422+
423+ interface IdFixingRepository <V > extends Repository <V , Long > {
401424 }
402425
403- interface IdFixingRepository < T > extends Repository < T , Long > {
426+ static class ConcreteRepository implements IdFixingRepository < String > {
404427 }
405428
406429 static class WithMethodParameter {
0 commit comments