Java (Android) - 类型、泛型、构造函数签名、检索对类的引用

标签 java android

我搜索了 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/

相关文章:

java - 在Java中,如何实现UDP端口扫描?

java - 相当于 java 中的 boost xml (nvp) 序列化

java - 试图禁用可聚焦,不工作,android

java - 在 Hadoop 中获取百分比

Java:计算 HashMap<String, ArrayList<String>> 中的项目总数

java - Java 9 中 java.se 模块的意义是什么?

android - 多个 Activity 通用的选项菜单项

Android-在Firebase数据库中编写节点内的Arraylist

android - VideoView 不会缩放内容以匹配其父项

android - 如何将加载指示器添加到 AutoCompleteTextView