2323import java .util .List ;
2424import java .util .Map ;
2525
26- import javax .lang .model .element .TypeElement ;
2726import javax .lang .model .type .ArrayType ;
2827import javax .lang .model .type .DeclaredType ;
2928import javax .lang .model .type .TypeKind ;
3029import javax .lang .model .type .TypeMirror ;
30+ import javax .lang .model .type .TypeVariable ;
3131
3232import org .androidannotations .holder .GeneratedClassHolder ;
3333
@@ -86,12 +86,14 @@ public class BundleHelper {
8686 private String methodNameToSave ;
8787 private String methodNameToRestore ;
8888
89+ private TypeMirror upperBound ;
90+
8991 public BundleHelper (AnnotationHelper helper , TypeMirror element ) {
9092 annotationHelper = helper ;
9193 this .element = element ;
9294
9395 String typeString = element .toString ();
94- TypeElement elementType = annotationHelper . typeElementFromQualifiedName ( typeString ) ;
96+ TypeMirror type = element ;
9597
9698 if (METHOD_SUFFIX_BY_TYPE_NAME .containsKey (typeString )) {
9799
@@ -105,15 +107,18 @@ public BundleHelper(AnnotationHelper helper, TypeMirror element) {
105107 boolean hasTypeArguments = false ;
106108 if (arrayType .getComponentType () instanceof DeclaredType ) {
107109 DeclaredType declaredType = (DeclaredType ) arrayType .getComponentType ();
108- typeString = declaredType . asElement (). toString () ;
110+ type = declaredType ;
109111 hasTypeArguments = declaredType .getTypeArguments ().size () > 0 ;
112+ } else if (arrayType .getComponentType ().getKind () == TypeKind .TYPEVAR ) {
113+ type = arrayType .getComponentType ();
114+ upperBound = getUpperBound (type );
115+ restoreCallNeedCastStatement = true ;
116+ restoreCallNeedsSuppressWarning = true ;
110117 } else {
111- typeString = arrayType .getComponentType (). toString ();
118+ type = arrayType .getComponentType ();
112119 }
113120
114- elementType = annotationHelper .typeElementFromQualifiedName (typeString );
115-
116- if (isTypeParcelable (elementType )) {
121+ if (isTypeParcelable (type )) {
117122 methodNameToSave = "put" + "ParcelableArray" ;
118123 methodNameToRestore = "get" + "ParcelableArray" ;
119124
@@ -135,11 +140,10 @@ public BundleHelper(AnnotationHelper helper, TypeMirror element) {
135140 TypeMirror typeArgument = typeArguments .get (0 );
136141 if (typeArgument instanceof DeclaredType ) {
137142 declaredType = (DeclaredType ) typeArgument ;
138- typeString = declaredType .asElement ().toString ();
139- elementType = annotationHelper .typeElementFromQualifiedName (typeString );
143+ type = declaredType ;
140144 hasTypeArguments = declaredType .getTypeArguments ().size () > 0 ;
141145 }
142- if (isTypeParcelable (elementType )) {
146+ if (isTypeParcelable (type )) {
143147 methodNameToSave = "put" + "ParcelableArrayList" ;
144148 methodNameToRestore = "get" + "ParcelableArrayList" ;
145149
@@ -159,15 +163,10 @@ public BundleHelper(AnnotationHelper helper, TypeMirror element) {
159163
160164 } else {
161165
162- boolean hasTypeArguments = false ;
163- if (element instanceof DeclaredType ) {
164- DeclaredType declaredType = (DeclaredType ) element ;
165- typeString = declaredType .asElement ().toString ();
166- elementType = annotationHelper .typeElementFromQualifiedName (typeString );
167- hasTypeArguments = declaredType .getTypeArguments ().size () > 0 ;
168- }
166+ boolean hasTypeArguments = element .getKind () == TypeKind .DECLARED && hasTypeArguments (element ) || //
167+ element .getKind () == TypeKind .TYPEVAR && hasTypeArguments (getUpperBound (element ));
169168
170- if (isTypeParcelable (elementType )) {
169+ if (isTypeParcelable (type )) {
171170 methodNameToSave = "put" + "Parcelable" ;
172171 methodNameToRestore = "get" + "Parcelable" ;
173172 } else {
@@ -186,9 +185,19 @@ public String getMethodNameToSave() {
186185 return methodNameToSave ;
187186 }
188187
189- private boolean isTypeParcelable (TypeElement elementType ) {
190- TypeElement parcelableType = annotationHelper .typeElementFromQualifiedName (CanonicalNameConstants .PARCELABLE );
191- return elementType != null && annotationHelper .isSubtype (elementType , parcelableType );
188+ private boolean isTypeParcelable (TypeMirror typeMirror ) {
189+ TypeMirror parcelableType = annotationHelper .typeElementFromQualifiedName (CanonicalNameConstants .PARCELABLE ).asType ();
190+ return annotationHelper .isSubtype (typeMirror , parcelableType );
191+ }
192+
193+ private TypeMirror getUpperBound (TypeMirror type ) {
194+ TypeVariable typeVariable = (TypeVariable ) type ;
195+ return typeVariable .getUpperBound ();
196+ }
197+
198+ private boolean hasTypeArguments (TypeMirror type ) {
199+ DeclaredType declaredType = (DeclaredType ) type ;
200+ return declaredType .getTypeArguments ().size () > 0 ;
192201 }
193202
194203 public JExpression getExpressionToRestoreFromIntentOrBundle (JClass variableClass , JExpression intent , JExpression extras , JExpression extraKey , JMethod method , GeneratedClassHolder holder ) {
@@ -202,7 +211,12 @@ public JExpression getExpressionToRestoreFromIntentOrBundle(JClass variableClass
202211 public JExpression getExpressionToRestoreFromBundle (JClass variableClass , JExpression bundle , JExpression extraKey , JMethod method , GeneratedClassHolder holder ) {
203212 JExpression expressionToRestore ;
204213 if (methodNameToRestore .equals ("getParcelableArray" )) {
205- JClass erasure = variableClass .elementType ().erasure ().array ();
214+ JClass erasure ;
215+ if (upperBound != null ) {
216+ erasure = codeModelHelper .typeMirrorToJClass (upperBound , holder ).erasure ().array ();
217+ } else {
218+ erasure = variableClass .elementType ().erasure ().array ();
219+ }
206220 expressionToRestore = holder .refClass (org .androidannotations .api .bundle .BundleHelper .class ).staticInvoke ("getParcelableArray" ).arg (bundle ).arg (extraKey ).arg (erasure .dotclass ());
207221 } else {
208222 expressionToRestore = JExpr .invoke (bundle , methodNameToRestore ).arg (extraKey );
0 commit comments