[英]Java generics, using <? extends Superclass>, clarification needed
假设
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
您能否描述为什么一种方法优于另一种方法,以及何时应使用?
如您所料,如果使用List<X>
,它将仅适用于X
类型的对象。
如果是List<? extends X>
List<? extends X>
将接受的列表X
和的所有子类X
或所有的实施方案中X
如果X
是一个interface
。
一个人的好处, ? extends X
当您想处理各种不同的子类时, ? extends X
可以帮助您处理情况。
例如,一个函数可以计算文件大小(以字节为单位):
public int getTotalSizeInBytes(List<? extends File> files) {
...
}
现在,此函数可以计算大小,而不管文件类型为plainTextFile
, excelFile
, wordFile
, databaseFile
等。
假设您有这样的事情:
List<A> listOfA = new ArrayList<A>();
listOfA.add(new A());
您将可以调用doMagic()
,但不能调用doMagic2()
。 如果只想让您的方法处理X
对象,而不要处理其任何子类,请使用List<X>
。 但是,如果您的方法想处理任何类型的X
对象,而不关心它是否实际上是子类,请使用List<? extends X>
List<? extends X>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.