[英]Generics with ArrayAdapters
我在尝试创建通用ArrayAdapter时遇到了问题。 这可能与我对Java中的泛型有限的理解有关,并且希望有人可以让我直截了当。 基本上我有一个抽象的基本适配器类:
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,它们的列表也不相同。 这个线程( 将List <SubClass>强制转换为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,它是谁 - 任何人都可以提供建议吗?
谢谢!
嗯,我的Java SDK甚至不让我编译
public class MyAdapter extends BaseAdapter<? extends BaseModel>
它期望extends
后的无界类或接口。 但这没关系,如果这是一个选项,解决您的问题的方法是更改BaseAdapter
类:
public abstract class BaseAdapter<T> extends ArrayAdapter<T>
{
....
private List<T> items;
....
protected abstract List<? extends T> build(JSONArray jsonArray);
....
@Override
public T getItem(int position)
{
return items.get(position);
}
}
然后
public class MyAdapter extends BaseAdapter<BaseModel>
{
...
protected List<? extends BaseModel> build(JSONArray jsonArray)
...
}
与以前的代码将工作。
编辑:
忘了解释为什么你的第一个解决方案不起作用:
语言规范说
子类型不会扩展到泛型类型:T <:U并不意味着C <:C
这意味着虽然SubclassModel扩展了BaseModel,但这并不意味着List扩展了List。
我无法编译
public class MyAdapter extends BaseAdapter<? extends BaseModel>
给我一个错误,说“超类型可能没有指定通配符”。
对我有用的是 -
public abstract class BaseAdapter<T> extends ArrayAdapter<T>
{
private List<? extends T> items;
protected abstract List<? extends T> build(JSONArray jsonArray);
}
和这个
public class MyAdapter extends BaseAdapter<BaseModel>
{
protected List<? extends BaseModel> build(JSONArray jsonArray);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.