我搜索了 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;
}
...
谢谢
最佳答案
你可以试试
public class ViewPool<E extends View>
然后为了实例化您的 View ,您可以使用带有签名的工厂:
public abstract class ViewFactory<E extends View> {
public E createView( Context c );
}
并在您的 View 池中使用它来获取 E 的新实例,在 View 池的构造时注入(inject)依赖项:
public class ViewPool<E extends View> {
ViewFactory<E> factory;
public viewpool( ViewFactory<E> factory ) {
this.factory = factory;
}
public E employView(){
E v;
if(unemployed.size() > 0){
v = unemployed.get(0);
unemployed.remove(v);
} else {
v = factory.createView( context );
}
employed.add(v);
return v;
}
然后使用以下方法创建您的 View 池:
ViewFactory<TextView> factory = new ViewFactory<TextView>() {
public TextView createView( Context c ) {
return new TextView( c );
}
}
new ViewPool<TextView>( factory );
关于Java (Android) - 类型、泛型、构造函数签名、检索对类的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8860899/