Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当涉及泛型时,通过继承重用Java代码(特别是列表)?_Java_Android_Generics_Inheritance_Oop - Fatal编程技术网

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

当涉及泛型时,通过继承重用Java代码(特别是列表)?,java,android,generics,inheritance,oop,Java,Android,Generics,Inheritance,Oop,除了如何“使用”泛型之外,我对泛型知之甚少。在我的应用程序中,我有各种各样的ListView活动,它们似乎共享类似的方法和变量,并且具有确切的“算法”,即执行的步骤都非常相同 例如,在我的onCreate方法中,我调用一个方法来添加页脚,启动一个进度对话框,调用一个方法来获取基于xml url的内容,并且有一个处理程序和可运行字段,用于在完成xml解析时调用该方法来填充列表的数据 我在想,也许我可以创建一个BaseListActivity来完成所有这些事情/拥有所有这些事情的方法,并且每个特定的

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

例如,在我的onCreate方法中,我调用一个方法来添加页脚,启动一个进度对话框,调用一个方法来获取基于xml url的内容,并且有一个处理程序和可运行字段,用于在完成xml解析时调用该方法来填充列表的数据

我在想,也许我可以创建一个BaseListActivity来完成所有这些事情/拥有所有这些事情的方法,并且每个特定的ListActivity都可以从中扩展。问题是,它们使用列表对象来保存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;
//来自xml的游戏列表
private List mGames=new ArrayList();
私有列表mNewGames=null;
//需要回调到UI线程的处理程序
私有最终处理程序mHandler=新处理程序();
//创建可运行的过帐
最终可运行mUpdateResults=新可运行(){
公开募捐{
mGames.addAll(mNewGames);
fillData();
}
};
LayoutInflater mInflater=null;
private ProgressDialog mProgressDialog=null;
private int currentPage=0;

因此,真正的主要区别是,每个不同的活动将使用不同的对象类型作为列表(即游戏、媒体、文章等)。我该怎么做呢?

定义一个模板化列表

List<E> mObjItems = new ArrayList(); 
List mObjItems=new ArrayList();

并使用它来保存类,如
游戏
媒体
,或
文章
,定义模板化列表

List<E> mObjItems = new ArrayList(); 
List mObjItems=new ArrayList();

并用它来举办类似于
游戏
媒体
,或
文章
,之类的课程。我想到的是:

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

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

}
公共抽象类BaseListActivity扩展ListViewActivity{
私人名单;
受保护的抽象列表readAllFromXML();
...
}
参数T代表列表活动实现所使用的实际类型。例如,派生类可以如下所示:

public TexyListActivity extends BaseListActivity<String> {
    protected List<String> readAllFromXML() {
        ....
    }
    ...
}
公共TexyListActivity扩展了BaseListActivity{ 受保护列表readAllFromXML(){ .... } ... }
readAllFromXML方法留给子类实现,因为每个实现都为列表实例化不同的对象类型,因此它使用不同的逻辑从XML创建它们。

我想到的是:

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

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

}
公共抽象类BaseListActivity扩展ListViewActivity{
私人名单;
受保护的抽象列表readAllFromXML();
...
}
参数T代表列表活动实现所使用的实际类型。例如,派生类可以如下所示:

public TexyListActivity extends BaseListActivity<String> {
    protected List<String> readAllFromXML() {
        ....
    }
    ...
}
公共TexyListActivity扩展了BaseListActivity{ 受保护列表readAllFromXML(){ .... } ... }
readAllFromXML方法留给子类实现,因为每个实现为列表实例化不同的对象类型,因此它使用不同的逻辑从XML创建它们。

适配器示例可以吗

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 {
    //
    }
}
公共抽象类OnlineListAdapter扩展BaseAdapter{
私有最终ArrayList项=新ArrayList();
@凌驾
公共最终T getItem(内部位置){
返回项目。获取(位置);
}
受保护的抽象T反序列化(JSONObject obj)抛出JSONException;
}
公共类CategoriesAdapter扩展
在线自适应{
@凌驾
受保护的CatalogApp反序列化(JSONObject obj)抛出JSONException{
//
}
}

适配器示例可以吗

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 {
    //
    }
}
公共抽象类OnlineListAdapter扩展BaseAdapter{
私有最终ArrayList项=新ArrayList();
@凌驾
公共最终T getItem(内部位置){
返回项目。获取(位置);
}
受保护的抽象T反序列化(JSONObject obj)抛出JSONException;
}
公共类CategoriesAdapter扩展
在线自适应{
@凌驾
受保护的CatalogApp反序列化(JSONObject obj)抛出JSONException{
//
}
}