18
18
19
19
import java .io .Serializable ;
20
20
import java .lang .reflect .Method ;
21
+ import java .lang .reflect .ParameterizedType ;
21
22
import java .lang .reflect .Type ;
22
23
import java .lang .reflect .TypeVariable ;
23
24
import java .util .Collection ;
24
25
import java .util .HashMap ;
25
26
import java .util .List ;
26
27
import java .util .Map ;
28
+ import java .util .function .Supplier ;
27
29
28
30
import org .junit .jupiter .api .Test ;
29
31
30
32
import static org .assertj .core .api .Assertions .assertThat ;
31
33
import static org .springframework .core .GenericTypeResolver .getTypeVariableMap ;
34
+ import static org .springframework .core .GenericTypeResolver .resolveParameterType ;
35
+ import static org .springframework .core .GenericTypeResolver .resolveReturnType ;
32
36
import static org .springframework .core .GenericTypeResolver .resolveReturnTypeArgument ;
33
37
import static org .springframework .core .GenericTypeResolver .resolveType ;
34
38
import static org .springframework .core .GenericTypeResolver .resolveTypeArgument ;
39
+ import static org .springframework .core .GenericTypeResolver .resolveTypeArguments ;
35
40
import static org .springframework .util .ReflectionUtils .findMethod ;
36
41
37
42
/**
@@ -106,25 +111,25 @@ void boundParameterizedType() {
106
111
void testGetTypeVariableMap () {
107
112
Map <TypeVariable , Type > map ;
108
113
109
- map = GenericTypeResolver . getTypeVariableMap (MySimpleInterfaceType .class );
114
+ map = getTypeVariableMap (MySimpleInterfaceType .class );
110
115
assertThat (map .toString ()).isEqualTo ("{T=class java.lang.String}" );
111
116
112
- map = GenericTypeResolver . getTypeVariableMap (MyCollectionInterfaceType .class );
117
+ map = getTypeVariableMap (MyCollectionInterfaceType .class );
113
118
assertThat (map .toString ()).isEqualTo ("{T=java.util.Collection<java.lang.String>}" );
114
119
115
- map = GenericTypeResolver . getTypeVariableMap (MyCollectionSuperclassType .class );
120
+ map = getTypeVariableMap (MyCollectionSuperclassType .class );
116
121
assertThat (map .toString ()).isEqualTo ("{T=java.util.Collection<java.lang.String>}" );
117
122
118
- map = GenericTypeResolver . getTypeVariableMap (MySimpleTypeWithMethods .class );
123
+ map = getTypeVariableMap (MySimpleTypeWithMethods .class );
119
124
assertThat (map .toString ()).isEqualTo ("{T=class java.lang.Integer}" );
120
125
121
- map = GenericTypeResolver . getTypeVariableMap (TopLevelClass .class );
126
+ map = getTypeVariableMap (TopLevelClass .class );
122
127
assertThat (map .toString ()).isEqualTo ("{}" );
123
128
124
- map = GenericTypeResolver . getTypeVariableMap (TypedTopLevelClass .class );
129
+ map = getTypeVariableMap (TypedTopLevelClass .class );
125
130
assertThat (map .toString ()).isEqualTo ("{T=class java.lang.Integer}" );
126
131
127
- map = GenericTypeResolver . getTypeVariableMap (TypedTopLevelClass .TypedNested .class );
132
+ map = getTypeVariableMap (TypedTopLevelClass .TypedNested .class );
128
133
assertThat (map ).hasSize (2 );
129
134
Type t = null ;
130
135
Type x = null ;
@@ -142,19 +147,19 @@ void testGetTypeVariableMap() {
142
147
143
148
@ Test
144
149
void resolveTypeArgumentsOfAbstractType () {
145
- Class <?>[] resolved = GenericTypeResolver . resolveTypeArguments (MyConcreteType .class , MyAbstractType .class );
150
+ Class <?>[] resolved = resolveTypeArguments (MyConcreteType .class , MyAbstractType .class );
146
151
assertThat (resolved ).containsExactly (Character .class );
147
152
}
148
153
149
154
@ Test // SPR-11030
150
155
void getGenericsCannotBeResolved () {
151
- Class <?>[] resolved = GenericTypeResolver . resolveTypeArguments (List .class , Iterable .class );
156
+ Class <?>[] resolved = resolveTypeArguments (List .class , Iterable .class );
152
157
assertThat (resolved ).isNull ();
153
158
}
154
159
155
160
@ Test // SPR-11052
156
161
void getRawMapTypeCannotBeResolved () {
157
- Class <?>[] resolved = GenericTypeResolver . resolveTypeArguments (Map .class , Map .class );
162
+ Class <?>[] resolved = resolveTypeArguments (Map .class , Map .class );
158
163
assertThat (resolved ).isNull ();
159
164
}
160
165
@@ -163,26 +168,38 @@ void getRawMapTypeCannotBeResolved() {
163
168
void getGenericsOnArrayFromParamCannotBeResolved () throws Exception {
164
169
MethodParameter methodParameter = MethodParameter .forExecutable (
165
170
WithArrayBase .class .getDeclaredMethod ("array" , Object [].class ), 0 );
166
- Class <?> resolved = GenericTypeResolver . resolveParameterType (methodParameter , WithArray .class );
171
+ Class <?> resolved = resolveParameterType (methodParameter , WithArray .class );
167
172
assertThat (resolved ).isEqualTo (Object [].class );
168
173
}
169
174
170
175
@ Test // SPR-11044
171
176
void getGenericsOnArrayFromReturnCannotBeResolved () throws Exception {
172
- Class <?> resolved = GenericTypeResolver . resolveReturnType (
177
+ Class <?> resolved = resolveReturnType (
173
178
WithArrayBase .class .getDeclaredMethod ("array" , Object [].class ), WithArray .class );
174
179
assertThat (resolved ).isEqualTo (Object [].class );
175
180
}
176
181
177
182
@ Test // SPR-11763
178
183
void resolveIncompleteTypeVariables () {
179
- Class <?>[] resolved = GenericTypeResolver . resolveTypeArguments (IdFixingRepository .class , Repository .class );
184
+ Class <?>[] resolved = resolveTypeArguments (IdFixingRepository .class , Repository .class );
180
185
assertThat (resolved ).isNotNull ();
181
186
assertThat (resolved ).hasSize (2 );
182
187
assertThat (resolved [0 ]).isEqualTo (Object .class );
183
188
assertThat (resolved [1 ]).isEqualTo (Long .class );
184
189
}
185
190
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
+
186
203
@ Test
187
204
void resolvePartiallySpecializedTypeVariables () {
188
205
Type resolved = resolveType (BiGenericClass .class .getTypeParameters ()[0 ], TypeFixedBiGenericClass .class );
@@ -398,9 +415,15 @@ abstract static class WithArray<T> extends WithArrayBase<T> {
398
415
}
399
416
400
417
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 > {
401
424
}
402
425
403
- interface IdFixingRepository < T > extends Repository < T , Long > {
426
+ static class ConcreteRepository implements IdFixingRepository < String > {
404
427
}
405
428
406
429
static class WithMethodParameter {
0 commit comments