Java泛型,使用<! - ?扩展Superclass - >,需要澄清

时间:2012-08-02 15:55:53

标签: java generics

假设

    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

你能描述为什么一种方法优先于另一种方法,何时应该使用呢?

2 个答案:

答案 0 :(得分:3)

如果您可以猜到List<X>,则仅适用于X类型的对象。

对于List<? extends X>,如果X,它会接受X列表以及X的所有子类或X的所有实现}是一个interface

一个优于另一个的好处,? extends X将允许您在处理各种不同的子类时处理情况。

一个例子是计算文件大小(以字节为单位)的函数:

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

现在,无论文件类型是plainTextFileexcelFilewordFiledatabaseFile等,此函数都可以计算大小。

答案 1 :(得分:2)

假设你有这样的东西:

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

您可以致电doMagic(),但无法拨打doMagic2()。如果您希望您的方法只处理X个对象而不处理任何子类,请使用List<X>。但是,如果您的方法想要处理任何类型的X对象,而不关心它是否实际上是子类,请使用List<? extends X>