2012-08-02 45 views
1

假设Java泛型,使用<?扩展超类>,澄清需要

A extends X 

您需要在目标执行一些操作要么A.法进行操作可能是:

public void doMagic(List<? extends X> e) 

或者,你可以选择把它称作

public void doMagic2(List<X> e) 

你问魔术可以通过:

List<X> listOfA = new ArrayList<X>(); 
    listOfA.add(new A()); 

    C c = new C(); 
    c.doMagic(listOfA); // works as expected 
    c.doMagic2(listOfA); // works as expected 

你能描述为什么一种方法比另一种方法更受欢迎,什么时候应该使用它?

回答

3

如您所知,List<X>仅适用于X类型的对象。

List<? extends X>情况下,它会接受X列表和X所有子类或X所有的实现,如果X是一个interface

当你想要处理各种不同的子类时,一个相对于另一个的好处,? extends X可以让你照顾情况。

一个例子是计算,比如功能,尺寸文件的字节:

public int getTotalSizeInBytes(List<? extends File> files) { 
... 
} 

现在,这个功能可以去计算尺寸,不管文件类型可以是plainTextFileexcelFilewordFiledatabaseFile

2

假设你有这样的事情:

List<A> listOfA = new ArrayList<A>(); 
    listOfA.add(new A()); 

你将能够拨打doMagic(),但您无法拨打doMagic2()。如果你想让你的方法只处理X对象而不是任何其子类,请使用List<X>。但是,如果您的方法想要处理任何种类的物体,而不是关心它是否实际上是儿童类,请使用List<? extends X>

相关问题