Java:Can';t到通用列表<;?扩展父级>;迈利斯特

Java:Can';t到通用列表<;?扩展父级>;迈利斯特,java,list,generics,inheritance,collections,Java,List,Generics,Inheritance,Collections,另一个例子很复杂,我一点也不理解,我的问题在某种程度上是类似的,但正如我所说的,它更简单,可能会得到更简单的答案 public List<? extends Parent> myfunction(List<? extends Parent> mylist){ mylist.add(new Child()) ; //Doesn't Compile } public ListWhatList如何添加return语句,或者声明返回void的方法……我相信您正在

另一个例子很复杂,我一点也不理解,我的问题在某种程度上是类似的,但正如我所说的,它更简单,可能会得到更简单的答案

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

public ListWhat
List如何添加
return
语句,或者声明返回
void
的方法……

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

在一般情况下,您可以这样做:

public <T extends Parent> List<T> myfunction(List<T> myList) {
   ... // Add something to myList
   return myList;
} 
在最后一行中,使用
OtherChild
对象的列表调用
myfunction()
。显然,将
子对象添加到这样的列表中是非法的。编译器通过拒绝
myfunction()

附录

如果希望
myfunction()
能够将元素添加到
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;
} 
公共接口工厂{
公共不创建();
}
公共列表myfunction(列表myList,

工厂以Jon Skeet在中的示例为例,假设您使用

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

public list向我们展示如何声明子类和父类。另外,我建议任何类名都使用首字母大写。该示例仅用于解释,因为您可以看到我使用了父类和子类类比,请随意编辑。这也是这里的问题。您在这里说什么?我指的是(6年前)这段代码没有编译的最明显原因(函数有一个返回类型,但没有返回语句)。这样更好,但如何创建类型为T的元素?这在Java中不起作用。您不能执行
new T()
,其中T是一个类型参数。您可以使用工厂来克服这一点(我正在为答案编写一个附录,其中讨论了这一点)“不能添加任何内容”并不完全正确。您可以添加
null
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(); }
  });
}
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;
}