Я столкнулся с проблемой при попытке создать универсальный адаптер ArrayAdapter. Вероятно, это связано с моим ограниченным пониманием дженериков в Java, и я надеялся, что кто-то сможет меня поправить. В основном у меня есть абстрактный базовый класс адаптера:
public abstract class BaseAdapter extends ArrayAdapter
{
....
private List items;
....
protected abstract List build(JSONArray jsonArray);
....
@Override
public T getItem(int position)
{
return items.get(position);
}
....
}
Затем у меня есть адаптер, расширяющий этот базовый класс:
public class MyAdapter extends BaseAdapter
{
....
@Override
protected List build(JSONArray jsonArray)
{
if (useBaseModel())
{
return BaseModel.buildBaseModels(jsonArray); //returns List
}
else
{
return SubclassModel.buildSubclassModels(jsonArray); //returns List
}
}
....
}
Модели определяются как:
public class BaseModel{...}
public class SubclassModel extends BaseModel{....}
Это не компилируется, поскольку даже если SubclassModel расширяет BaseModel, их списки не эквивалентны. Этот поток ( Самый эффективный способ преобразования List
List extends BaseModel>
Когда я перехожу на:
public class MyAdapter extends BaseAdapter extends BaseModel>
{
...
protected List extends BaseModel> build(JSONArray jsonArray)
...
}
, ошибки в build, но теперь появляется ошибка уровня класса: getItem (int) в BaseAdapter конфликтует с getItem (int) в android.widget.ArrayAdapter; пытается использовать несовместимый тип возвращаемого значения.
Кажется, что getItem должен возвращать тип? расширяет BaseModel, что это такое - кто-нибудь может посоветовать?
Спасибо!