我试图创建一个通用的ArrayAdapter时遇到了问题。这可能与我对Java中泛型的有限理解有关,希望有人能够让我直观。基本上我有一个抽象基适配器类:与ArrayAdapter的泛型
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);
}
....
}
然后我就扩展这个基类的适配器:
public class MyAdapter extends BaseAdapter<BaseModel>
{
....
@Override
protected List<BaseModel> build(JSONArray jsonArray)
{
if (useBaseModel())
{
return BaseModel.buildBaseModels(jsonArray); //returns List<BaseModel>
}
else
{
return SubclassModel.buildSubclassModels(jsonArray); //returns List<SubclassModel>
}
}
....
}
该机型被定义为:
public class BaseModel{...}
public class SubclassModel extends BaseModel{....}
这不尽管SubclassModel扩展了BaseModel,但它们的列表并不等价。这个线程(Most efficient way to cast List<SubClass> to List<BaseClass>)解释为多,并表示要改用这一点:
List<? extends BaseModel>
当我更改为:
public class MyAdapter extends BaseAdapter<? extends BaseModel>
{
...
protected List<? extends BaseModel> build(JSONArray jsonArray)
...
}
在构建方法的误差消失,但现在有一类说明: BaseAdapter中的getItem(int)与android.widget.ArrayAdapter中的getItem(int)发生冲突;试图使用不兼容的返回类型。
看起来好像getItem应该返回一个类型?扩展BaseModel,这是 - 任何人都可以建议?
谢谢!
+1 ..Looks像我打字我的答案,而你正在张贴你的:-) – Kal
类似的想法,类似的错误,类似的解决方案,这是可怕的:) – emboss
果然 - 谢谢浮雕和Kal!我会检查第一个答案。 – user888867