引用我搜索的SO和发现了几个答案显然与我的问题,并已阅读下列以及:的Java(Android版) - 类型,泛型,构造函数签名,检索到
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);
}
}
}
现在让我们假设我想修改上述任何视图类型的工作,通过这样的:
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;
}
...
感谢
感谢您的答复...怎么那么会:
}
然后使用创建viewpool我去获得一个通用的引用,所以我可以实例一个新的? –
momo
2012-01-14 07:56:14
看看我的例子,你应该使用工厂来实现这一点。在java中没有构造函数的继承,因此不可能使用任何通用形式的构造函数来从泛型符号创建视图。解决方法(实际上是一个好的设计)是使用工厂。此外,它有两个优点:您将池与池中实例的创建分开,并且显式声明对负责对象创建的对象的依赖关系。 – Snicolas 2012-01-14 08:26:28
是的,我的第一个评论中的问题是在你的例子出现之前。我明白你在做什么,并能欣赏这种模式。谢谢 – momo 2012-01-14 09:06:18