I had a problem while trying to create a generic ArrayAdapter. This is probably due to my limited understanding of Java generics and was hoping that someone could install me. I basically have an abstract base adapter:
public abstract class BaseAdapter<T> extends ArrayAdapter<T> { .... private List<T> items; .... protected abstract List<T> build(JSONArray jsonArray); .... @Override public T getItem(int position) { return items.get(position); } .... }
Then I have an adapter that extends this base class:
public class MyAdapter extends BaseAdapter<BaseModel> { .... @Override protected List<BaseModel> build(JSONArray jsonArray) { if (useBaseModel()) { return BaseModel.buildBaseModels(jsonArray);
Models are defined as:
public class BaseModel{...} public class SubclassModel extends BaseModel{....}
This does not compile, since SubclassModel extends BaseModel, lists of them are not equivalent. This thread ( The most efficient way to cast a List <SubClass> to a <BaseClass> list ) explains the same and says to use it instead:
List<? extends BaseModel>
When I go to:
public class MyAdapter extends BaseAdapter<? extends BaseModel> { ... protected List<? extends BaseModel> build(JSONArray jsonArray) ... }
assembly method errors go away, but now a class-level error occurs: getItem (int) in conflicts between BaseAdapter and getItem (int) in android.widget.ArrayAdapter; trying to use an incompatible return type.
It seems that getItem should return a type? extends BaseModel as it is - can anyone advise?
Thanks!
source share