繁体   English   中英

Java:无法使用通用列表 <? extends Parent> 我的列表

[英]Java: Can't to generic List<? extends Parent> mylist

另一个示例非常复杂,我一点也不理解,我的问题在某种程度上是相似的,但是正如我所说的那样,它更简单并且可能会给出更简单的答案

public List<? extends Parent> myfunction(List<? extends Parent> mylist){
       mylist.add(new Child())  ; //Doesn't Compile
}

我相信您正在寻找一种采用列表的方法,向其中添加一些内容,然后返回列表。 该列表是通用的,您希望返回类型与参数的类型匹配。

一般情况下,这是您的操作方法:

public <T extends Parent> List<T> myfunction(List<T> myList) {
   ... // Add something to myList
   return myList;
} 

具体来说,您正在尝试将new Child()添加到myList 这行不通。 可以使用多种列表来调用myfunction() ,而仅当列表为List<Parent>List<Child>才能添加new Child() 这是一个不同种类的列表的示例:

public static class Parent {}  
public static class Child extends Parent {}  
public static class OtherChild extends Parent {}

public <T extends Parent> List<T> myfunction(List<T> myList) {
  myList.add(new Child());
  return myList;
} 

myfunction(new ArrayList<OtherChild>());

在最后一行中,使用OtherChild对象列表调用myfunction() 显然,将Child对象添加到此类列表中是非法的。 编译器通过拒绝myfunction()的定义来防止这种情况

附录

如果希望myfunction()能够向myList添加元素, myList需要使用工厂(因为Java不允许使用new T() ,其中T是类型参数-由于类型被擦除 )。 这是myfunction()样子:

public interface Factory<T> {
  public T create();
}

public <T extends Parent> List<T> myfunction(List<T> myList, 
                                             Factory<? extends T> factory) {
  myList.add(factory.create());
  return myList;
} 

现在,它的用法是:

public static class ChildOfOtherChild extends OtherChild {}

myfunction(new ArrayList<OtherChild>(), new Factory<ChildOfOtherChild>() {
    @Override public ChildOfOtherChild create() { return new ChildOfOtherChild(); }
  });
}

什么List<? extends Parent> List<? extends Parent>的意思是“包含的一些未知的子类的实例只列出Parent ” -因为你不知道什么继承它是,但你不能添加任何null的列表(你可以得到Parent的情况下,但是)。

如果您有一个特定的子类Child想要将其实例添加到列表中,那么您真正需要的是:

public List<Child> myfunction(List<Child> mylist)

另一个问题中的乔恩·斯基特(Jon Skeet)的示例之后,假设您使用了

public List<? extends Fruit> myfunction(List<? extends Fruit> mylist){
       mylist.add(new Apple())  ; //Doesn't Compile
       return myList;
}

但后来用

List<Banana> bananas = new ArrayList<Banana>();
bananas = myfunction(bananas);

您不能将苹果添加到香蕉列表中。

可以做的是

public List<Fruit> addApple(List<Fruit> mylist){
       mylist.add(new Apple())  ; 
       return myList;
}

public List<Fruit> addBanana(List<Fruit> mylist){
       mylist.add(new Banana())  ; 
       return myList;
}

如何添加return语句,或声明方法以返回void ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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