繁体   English   中英

Java泛型,使用 <? extends Superclass> ,需要澄清

[英]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) {
...
}

现在,此函数可以计算大小,而不管文件类型为plainTextFileexcelFilewordFiledatabaseFile等。

假设您有这样的事情:

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM