【发布时间】:2012-01-14 07:47:27
【问题描述】:
我搜索了 SO 并找到了几个与我的问题明显相关的答案,并且还阅读了以下内容:
http://docs.oracle.com/javase/tutorial/java/generics/erasure.html http://www.artima.com/weblogs/viewpost.jsp?thread=208860 http://docs.oracle.com/javase/tutorial/extra/generics/index.html http://docs.oracle.com/javase/tutorial/java/generics/genmethods.html
但它们有点超出我的想象(我对 Java 和 Android 还很陌生)。
我正在尝试了解如何在自定义类中实现泛型。我认为一个例子是最好的解释方式。
假设我从这个基类开始:
import java.util.ArrayList;
import android.content.Context;
import android.widget.ImageView;
public class ViewPool {
private ArrayList<ImageView> employed;
private ArrayList<ImageView> unemployed;
private Context context;
public ViewPool(Context context){
this.context = context;
employed = new ArrayList<ImageView>();
unemployed = new ArrayList<ImageView>();
}
public ImageView employView(){
ImageView v;
if(unemployed.size() > 0){
v = unemployed.get(0);
unemployed.remove(v);
} else {
v = new ImageView(context);
}
employed.add(v);
return v;
}
public void retireView(ImageView v){
if(employed.contains(v)){
employed.remove(v);
unemployed.add(v);
}
}
}
现在假设我想修改上面的内容以使用任何 View 类型,传递如下:
new ViewPool<ImageView>(this);
或者...
new ViewPool<TextView>(this);
我将如何重写上面列出的类以接受这样的类型?我最初的尝试,比如下一个代码块,失败的原因可能很明显......
public class ViewPool<E> {
...
public E employView(){
E v;
if(unemployed.size() > 0){
v = unemployed.get(0);
unemployed.remove(v);
} else {
v = new E(context); // this line's obviously bad, but not sure what would be correct
}
employed.add(v);
return v;
}
...
谢谢
【问题讨论】: