涉及泛型时通过继承重用Java代码(特别是List)?

时间:2010-07-14 08:38:04

标签: java android generics inheritance oop

除了如何“使用它们”之外,我对泛型知之甚少。在我的应用程序中,我有各种ListView Activity,它们似乎共享类似的方法和变量,并且具有完全“算法”,因为执行的步骤都非常相同。

例如在我的onCreate方法中,我调用一个方法来添加一个页脚,启动一个进度对话框,调用一个方法来获取基于xml url的内容,还有一个Handler和Runnable字段用于调用方法在xml解析完成后填充列表的数据。

我想也许我可以创建一个BaseListActivity来完成所有这些事情/拥有所有这些东西的方法,每个特定的ListActivity都可以从中扩展。问题是他们使用List对象来保存xml解析的项以及ListAdapter所支持的项。

所以这里是所用字段的代码:

// list of games from xml
private List<Game> mGames = new ArrayList<Game>();
private List<Game> mNewGames = null;

// Need handler for callbacks to the UI thread
private final Handler mHandler = new Handler();

// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
    public void run() {
        mGames.addAll(mNewGames);
        fillData();
    }
};

LayoutInflater mInflater = null;
private ProgressDialog mProgressDialog = null;
private int currentPage = 0;

所以真正的主要区别在于每个不同的活动都会为List使用不同的对象类型(即游戏,媒体,文章等)。我该怎么做呢?

3 个答案:

答案 0 :(得分:1)

我想的是:

public abstract class BaseListActivity<T> extends ListViewActivity {
    private List<T> mItems; 

    protected abstract List<T> readAllFromXML();
    ...

}

参数T代表列表活动实现的实际类型。例如,派生类可以如下所示:

public TexyListActivity extends BaseListActivity<String> {
    protected List<String> readAllFromXML() {
        ....
    }
    ...
}

方法readAllFromXML留待子类实现,因为每个实现都为列表实例化不同的对象类型,因此它使用不同的逻辑从XML创建它们。

答案 1 :(得分:1)

适配器示例会吗?

public abstract class OnlineListAdapterTyped<T> extends BaseAdapter {

private final ArrayList<T> items = new ArrayList<T>();

    @Override
    public final T getItem(int position) {
        return items.get(position);
    }

    protected abstract T deserialize(JSONObject obj) throws JSONException;
}

public class CategoriesAdapter extends
        OnlineListAdapterTyped<CatalogAppCategory> {

    @Override
    protected CatalogApp deserialize(JSONObject obj) throws JSONException {
    //
    }
}

答案 2 :(得分:-1)

定义模板化列表

List<E> mObjItems = new ArrayList(); 

并使用它来保存GameMediaArticle等类。