2012-01-14 62 views
1

引用我搜索的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; 
    } 
... 

感谢

回答

3

你可以尝试

public class ViewPool<E extends View> 

然后实例化你的观点,你可以使用带签名的工厂:

public abstract class ViewFactory<E extends View> { 
    public E createView(Context c); 
} 

并在你的viewpool中使用它来获得E的新实例,在注射施工时间的依赖性viewpool:

ViewFactory<TextView> factory = new ViewFactory<TextView>() { 
    public TextView createView(Context c) { 
     return new TextView(c); 
    } 
} 
new ViewPool<TextView>(factory); 
+0

感谢您的答复...怎么那么会:

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; } 

}

然后使用创建viewpool我去获得一个通用的引用,所以我可以实例一个新的? – momo 2012-01-14 07:56:14

+0

看看我的例子,你应该使用工厂来实现这一点。在java中没有构造函数的继承,因此不可能使用任何通用形式的构造函数来从泛型符号创建视图。解决方法(实际上是一个好的设计)是使用工厂。此外,它有两个优点:您将池与池中实例的创建分开,并且显式声明对负责对象创建的对象的依赖关系。 – Snicolas 2012-01-14 08:26:28

+0

是的,我的第一个评论中的问题是在你的例子出现之前。我明白你在做什么,并能欣赏这种模式。谢谢 – momo 2012-01-14 09:06:18

相关问题