1
1
/*
2
- * Copyright 2009-2024 the original author or authors.
2
+ * Copyright 2009-2025 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
24
24
import java .lang .reflect .TypeVariable ;
25
25
import java .lang .reflect .WildcardType ;
26
26
import java .util .Arrays ;
27
+ import java .util .Objects ;
27
28
28
29
/**
29
30
* @author Iwao AVE!
31
+ * @author Vladimir Sitnikov
30
32
*/
31
33
public class TypeParameterResolver {
32
34
@@ -79,21 +81,26 @@ public static Type resolveReturnType(Method method, Type srcType) {
79
81
public static Type [] resolveParamTypes (Method method , Type srcType ) {
80
82
Type [] paramTypes = method .getGenericParameterTypes ();
81
83
Class <?> declaringClass = method .getDeclaringClass ();
82
- Type [] result = new Type [paramTypes .length ];
83
- for (int i = 0 ; i < paramTypes .length ; i ++) {
84
- result [i ] = resolveType (paramTypes [i ], srcType , declaringClass );
84
+ return resolveTypes (paramTypes , srcType , declaringClass );
85
+ }
86
+
87
+ private static Type [] resolveTypes (Type [] types , Type srcType , Class <?> declaringClass ) {
88
+ Type [] args = new Type [types .length ];
89
+ for (int i = 0 ; i < types .length ; i ++) {
90
+ args [i ] = resolveType (types [i ], srcType , declaringClass );
85
91
}
86
- return result ;
92
+ return args ;
87
93
}
88
94
89
95
private static Type resolveType (Type type , Type srcType , Class <?> declaringClass ) {
90
96
if (type instanceof TypeVariable ) {
91
97
return resolveTypeVar ((TypeVariable <?>) type , srcType , declaringClass );
92
- }
93
- if (type instanceof ParameterizedType ) {
98
+ } else if (type instanceof ParameterizedType ) {
94
99
return resolveParameterizedType ((ParameterizedType ) type , srcType , declaringClass );
95
100
} else if (type instanceof GenericArrayType ) {
96
101
return resolveGenericArrayType ((GenericArrayType ) type , srcType , declaringClass );
102
+ } else if (type instanceof WildcardType ) {
103
+ return resolveWildcardType ((WildcardType ) type , srcType , declaringClass );
97
104
} else {
98
105
return type ;
99
106
}
@@ -102,61 +109,28 @@ private static Type resolveType(Type type, Type srcType, Class<?> declaringClass
102
109
private static Type resolveGenericArrayType (GenericArrayType genericArrayType , Type srcType ,
103
110
Class <?> declaringClass ) {
104
111
Type componentType = genericArrayType .getGenericComponentType ();
105
- Type resolvedComponentType = null ;
106
- if (componentType instanceof TypeVariable ) {
107
- resolvedComponentType = resolveTypeVar ((TypeVariable <?>) componentType , srcType , declaringClass );
108
- } else if (componentType instanceof GenericArrayType ) {
109
- resolvedComponentType = resolveGenericArrayType ((GenericArrayType ) componentType , srcType , declaringClass );
110
- } else if (componentType instanceof ParameterizedType ) {
111
- resolvedComponentType = resolveParameterizedType ((ParameterizedType ) componentType , srcType , declaringClass );
112
- }
112
+ Type resolvedComponentType = resolveType (componentType , srcType , declaringClass );
113
113
if (resolvedComponentType instanceof Class ) {
114
114
return Array .newInstance ((Class <?>) resolvedComponentType , 0 ).getClass ();
115
+ } else {
116
+ return new GenericArrayTypeImpl (resolvedComponentType );
115
117
}
116
- return new GenericArrayTypeImpl (resolvedComponentType );
117
118
}
118
119
119
120
private static ParameterizedType resolveParameterizedType (ParameterizedType parameterizedType , Type srcType ,
120
121
Class <?> declaringClass ) {
121
122
Class <?> rawType = (Class <?>) parameterizedType .getRawType ();
122
123
Type [] typeArgs = parameterizedType .getActualTypeArguments ();
123
- Type [] args = new Type [typeArgs .length ];
124
- for (int i = 0 ; i < typeArgs .length ; i ++) {
125
- if (typeArgs [i ] instanceof TypeVariable ) {
126
- args [i ] = resolveTypeVar ((TypeVariable <?>) typeArgs [i ], srcType , declaringClass );
127
- } else if (typeArgs [i ] instanceof ParameterizedType ) {
128
- args [i ] = resolveParameterizedType ((ParameterizedType ) typeArgs [i ], srcType , declaringClass );
129
- } else if (typeArgs [i ] instanceof WildcardType ) {
130
- args [i ] = resolveWildcardType ((WildcardType ) typeArgs [i ], srcType , declaringClass );
131
- } else {
132
- args [i ] = typeArgs [i ];
133
- }
134
- }
124
+ Type [] args = resolveTypes (typeArgs , srcType , declaringClass );
135
125
return new ParameterizedTypeImpl (rawType , null , args );
136
126
}
137
127
138
128
private static Type resolveWildcardType (WildcardType wildcardType , Type srcType , Class <?> declaringClass ) {
139
- Type [] lowerBounds = resolveWildcardTypeBounds (wildcardType .getLowerBounds (), srcType , declaringClass );
140
- Type [] upperBounds = resolveWildcardTypeBounds (wildcardType .getUpperBounds (), srcType , declaringClass );
129
+ Type [] lowerBounds = resolveTypes (wildcardType .getLowerBounds (), srcType , declaringClass );
130
+ Type [] upperBounds = resolveTypes (wildcardType .getUpperBounds (), srcType , declaringClass );
141
131
return new WildcardTypeImpl (lowerBounds , upperBounds );
142
132
}
143
133
144
- private static Type [] resolveWildcardTypeBounds (Type [] bounds , Type srcType , Class <?> declaringClass ) {
145
- Type [] result = new Type [bounds .length ];
146
- for (int i = 0 ; i < bounds .length ; i ++) {
147
- if (bounds [i ] instanceof TypeVariable ) {
148
- result [i ] = resolveTypeVar ((TypeVariable <?>) bounds [i ], srcType , declaringClass );
149
- } else if (bounds [i ] instanceof ParameterizedType ) {
150
- result [i ] = resolveParameterizedType ((ParameterizedType ) bounds [i ], srcType , declaringClass );
151
- } else if (bounds [i ] instanceof WildcardType ) {
152
- result [i ] = resolveWildcardType ((WildcardType ) bounds [i ], srcType , declaringClass );
153
- } else {
154
- result [i ] = bounds [i ];
155
- }
156
- }
157
- return result ;
158
- }
159
-
160
134
private static Type resolveTypeVar (TypeVariable <?> typeVar , Type srcType , Class <?> declaringClass ) {
161
135
Type result ;
162
136
Class <?> clazz ;
@@ -243,6 +217,7 @@ private static ParameterizedType translateParentTypeVars(ParameterizedType srcTy
243
217
}
244
218
245
219
private TypeParameterResolver () {
220
+ super ();
246
221
}
247
222
248
223
static class ParameterizedTypeImpl implements ParameterizedType {
@@ -253,6 +228,7 @@ static class ParameterizedTypeImpl implements ParameterizedType {
253
228
private final Type [] actualTypeArguments ;
254
229
255
230
public ParameterizedTypeImpl (Class <?> rawType , Type ownerType , Type [] actualTypeArguments ) {
231
+ super ();
256
232
this .rawType = rawType ;
257
233
this .ownerType = ownerType ;
258
234
this .actualTypeArguments = actualTypeArguments ;
@@ -273,6 +249,21 @@ public Type getRawType() {
273
249
return rawType ;
274
250
}
275
251
252
+ @ Override
253
+ public int hashCode () {
254
+ return (ownerType == null ? 0 : ownerType .hashCode ()) ^ Arrays .hashCode (actualTypeArguments ) ^ rawType .hashCode ();
255
+ }
256
+
257
+ @ Override
258
+ public boolean equals (Object obj ) {
259
+ if (!(obj instanceof ParameterizedType )) {
260
+ return false ;
261
+ }
262
+ ParameterizedType other = (ParameterizedType ) obj ;
263
+ return rawType .equals (other .getRawType ()) && Objects .equals (ownerType , other .getOwnerType ())
264
+ && Arrays .equals (actualTypeArguments , other .getActualTypeArguments ());
265
+ }
266
+
276
267
@ Override
277
268
public String toString () {
278
269
return "ParameterizedTypeImpl [rawType=" + rawType + ", ownerType=" + ownerType + ", actualTypeArguments="
@@ -286,6 +277,7 @@ static class WildcardTypeImpl implements WildcardType {
286
277
private final Type [] upperBounds ;
287
278
288
279
WildcardTypeImpl (Type [] lowerBounds , Type [] upperBounds ) {
280
+ super ();
289
281
this .lowerBounds = lowerBounds ;
290
282
this .upperBounds = upperBounds ;
291
283
}
@@ -299,18 +291,57 @@ public Type[] getLowerBounds() {
299
291
public Type [] getUpperBounds () {
300
292
return upperBounds ;
301
293
}
294
+
295
+ @ Override
296
+ public int hashCode () {
297
+ final int prime = 31 ;
298
+ int result = 1 ;
299
+ result = prime * result + Arrays .hashCode (lowerBounds );
300
+ result = prime * result + Arrays .hashCode (upperBounds );
301
+ return result ;
302
+ }
303
+
304
+ @ Override
305
+ public boolean equals (Object obj ) {
306
+ if (this == obj ) {
307
+ return true ;
308
+ }
309
+ if (!(obj instanceof WildcardTypeImpl )) {
310
+ return false ;
311
+ }
312
+ WildcardTypeImpl other = (WildcardTypeImpl ) obj ;
313
+ return Arrays .equals (lowerBounds , other .lowerBounds ) && Arrays .equals (upperBounds , other .upperBounds );
314
+ }
302
315
}
303
316
304
317
static class GenericArrayTypeImpl implements GenericArrayType {
305
318
private final Type genericComponentType ;
306
319
307
320
GenericArrayTypeImpl (Type genericComponentType ) {
321
+ super ();
308
322
this .genericComponentType = genericComponentType ;
309
323
}
310
324
311
325
@ Override
312
326
public Type getGenericComponentType () {
313
327
return genericComponentType ;
314
328
}
329
+
330
+ @ Override
331
+ public int hashCode () {
332
+ return Objects .hash (genericComponentType );
333
+ }
334
+
335
+ @ Override
336
+ public boolean equals (Object obj ) {
337
+ if (this == obj ) {
338
+ return true ;
339
+ }
340
+ if (!(obj instanceof GenericArrayTypeImpl )) {
341
+ return false ;
342
+ }
343
+ GenericArrayTypeImpl other = (GenericArrayTypeImpl ) obj ;
344
+ return Objects .equals (genericComponentType , other .genericComponentType );
345
+ }
315
346
}
316
347
}
0 commit comments