Я столкнулся с проблемой при попытке создать универсальный 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<? extends BaseModel>
Когда я изменяю на:
public class MyAdapter extends BaseAdapter<? extends BaseModel>
{
...
protected List<? extends BaseModel> build(JSONArray jsonArray)
...
}
ошибки в методе сборки исчезли, но теперь есть ошибка уровня класса, заявляющая: getItem (int) в BaseAdapter конфликтует с getItem (int) в android.widget.ArrayAdapter;попытка использовать несовместимый тип возвращаемого значения.
Кажется, что getItem должен возвращать тип?расширяет BaseModel, что это такое - кто-нибудь может посоветовать?
Спасибо!