Универсальные адаптеры с ArrayAdapter

Я столкнулся с проблемой при попытке создать универсальный адаптер 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 ) объясняет это и предлагает использовать это вместо:

List 

Когда я перехожу на:

public class MyAdapter extends BaseAdapter 
{
    ...
    protected List build(JSONArray jsonArray)
    ...
 }

, ошибки в build, но теперь появляется ошибка уровня класса: getItem (int) в BaseAdapter конфликтует с getItem (int) в android.widget.ArrayAdapter; пытается использовать несовместимый тип возвращаемого значения.

Кажется, что getItem должен возвращать тип? расширяет BaseModel, что это такое - кто-нибудь может посоветовать?

Спасибо!

7
задан Community 23 May 2017 в 12:06
поделиться