小编典典

Java的:不能对泛型列表MYLIST

java

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

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

阅读 216

收藏
2020-11-26

共1个答案

小编典典

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

通常情况下,这是您的操作方法:

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

具体来说,您尝试添加new Child()到中myList。这行不通。myfunction()可以使用多种列表来调用,而添加new Child()只能在列表为a List<Parent>或a时起作用List<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>());

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

现在,它的用法是:

public static class ChildOfOtherChild extends OtherChild {}

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