1

认为

    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

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

4

2 回答 2

3

万一List<X>你猜到了,它只适用于类型的对象X

如果是List<? extends X>,它将接受ifX的所有子类X或所有实现的列表。XXinterface

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

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

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

现在这个函数可以计算大小,不管文件类型是plainTextFile, excelFile,wordFile等等databaseFile

于 2012-08-02T16:03:15.590 回答
2

假设你有这样的事情:

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

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

于 2012-08-02T16:05:23.130 回答