@@ -156,6 +156,7 @@ private ParameterizedType extractAttributeConverterParameterizedType(Type base)
156
156
types .add ( clazz .getGenericSuperclass () );
157
157
types .addAll ( Arrays .asList ( clazz .getGenericInterfaces () ) );
158
158
for ( Type type : types ) {
159
+ type = resolveType ( type , base );
159
160
if ( ParameterizedType .class .isInstance ( type ) ) {
160
161
final ParameterizedType parameterizedType = (ParameterizedType ) type ;
161
162
if ( AttributeConverter .class .equals ( parameterizedType .getRawType () ) ) {
@@ -171,6 +172,54 @@ private ParameterizedType extractAttributeConverterParameterizedType(Type base)
171
172
return null ;
172
173
}
173
174
175
+ private static Type resolveType (Type target , Type context ) {
176
+ if ( target instanceof ParameterizedType ) {
177
+ return resolveParameterizedType ( (ParameterizedType ) target , context );
178
+ }
179
+ else if ( target instanceof TypeVariable ) {
180
+ return resolveTypeVariable ( (TypeVariable ) target , (ParameterizedType ) context );
181
+ }
182
+ return target ;
183
+ }
184
+
185
+ private static ParameterizedType resolveParameterizedType (final ParameterizedType parameterizedType , Type context ) {
186
+ Type [] actualTypeArguments = parameterizedType .getActualTypeArguments ();
187
+
188
+ final Type [] resolvedTypeArguments = new Type [actualTypeArguments .length ];
189
+ for ( int idx = 0 ; idx < actualTypeArguments .length ; idx ++ ) {
190
+ resolvedTypeArguments [idx ] = resolveType ( actualTypeArguments [idx ], context );
191
+ }
192
+ return new ParameterizedType () {
193
+
194
+ @ Override
195
+ public Type [] getActualTypeArguments () {
196
+ return resolvedTypeArguments ;
197
+ }
198
+
199
+ @ Override
200
+ public Type getRawType () {
201
+ return parameterizedType .getRawType ();
202
+ }
203
+
204
+ @ Override
205
+ public Type getOwnerType () {
206
+ return parameterizedType .getOwnerType ();
207
+ }
208
+
209
+ };
210
+ }
211
+
212
+ private static Type resolveTypeVariable (TypeVariable typeVariable , ParameterizedType context ) {
213
+ Class clazz = extractClass ( context .getRawType () );
214
+ TypeVariable [] typeParameters = clazz .getTypeParameters ();
215
+ for ( int idx = 0 ; idx < typeParameters .length ; idx ++ ) {
216
+ if ( typeVariable .getName ().equals ( typeParameters [idx ].getName () ) ) {
217
+ return resolveType ( context .getActualTypeArguments ()[idx ], context );
218
+ }
219
+ }
220
+ return typeVariable ;
221
+ }
222
+
174
223
public AttributeConverter getAttributeConverter () {
175
224
return attributeConverter ;
176
225
}
0 commit comments