假设
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
你能描述为什么一种方法优先于另一种方法,何时应该使用呢?
答案 0 :(得分:3)
如果您可以猜到List<X>
,则仅适用于X
类型的对象。
对于List<? extends X>
,如果X
,它会接受X
列表以及X
的所有子类或X
的所有实现}是一个interface
。
一个优于另一个的好处,? extends X
将允许您在处理各种不同的子类时处理情况。
一个例子是计算文件大小(以字节为单位)的函数:
public int getTotalSizeInBytes(List<? extends File> files) {
...
}
现在,无论文件类型是plainTextFile
,excelFile
,wordFile
,databaseFile
等,此函数都可以计算大小。
答案 1 :(得分:2)
假设你有这样的东西:
List<A> listOfA = new ArrayList<A>();
listOfA.add(new A());
您可以致电doMagic()
,但无法拨打doMagic2()
。如果您希望您的方法只处理X
个对象而不处理任何子类,请使用List<X>
。但是,如果您的方法想要处理任何类型的X
对象,而不关心它是否实际上是子类,请使用List<? extends X>