Java:不能通用List mylist

另一个例子非常复杂,我根本不理解它,我的问题在某种程度上是类似的,但正如我所说的那样更简单,可能会在更简单的答案中产生

public List myfunction(List mylist){ mylist.add(new Child()) ; //Doesn't Compile } 

我相信你正在寻找一种方法,它采用一个列表,添加一些东西,然后返回列表。 该列表是通用的,您希望返回类型与参数的类型匹配。

在一般情况下,这是你如何做到的:

 public  List myfunction(List myList) { ... // Add something to myList return myList; } 

具体来说,您正在尝试将new Child()添加到myList 。 这不行。 myfunction()可以用多种列表调用,而添加new Child()只能在列表是ListList才能工作。 以下是不同类型List的示例:

 public static class Parent {} public static class Child extends Parent {} public static class OtherChild extends Parent {} public  List myfunction(List myList) { myList.add(new Child()); return myList; } myfunction(new ArrayList()); 

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

附录

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

 public interface Factory { public T create(); } public  List myfunction(List myList, Factory factory) { myList.add(factory.create()); return myList; } 

现在,它的用法:

 public static class ChildOfOtherChild extends OtherChild {} myfunction(new ArrayList(), new Factory() { @Override public ChildOfOtherChild create() { return new ChildOfOtherChild(); } }); } 

什么List List表示“只包含一些未知的Parent子类的实例的列表” – 由于你不知道它是什么子类,你不能在列表中添加除null之外的任何内容(你可以从中获取Parent实例)但是,它)。

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

 public List myfunction(List mylist) 

继Jon Skeet在另一个问题上的例子之后,让我们说你使用了

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

但随后称它为

 List bananas = new ArrayList(); bananas = myfunction(bananas); 

您无法将苹果添加到香蕉列表中。

你能做的是

 public List addApple(List mylist){ mylist.add(new Apple()) ; return myList; } public List addBanana(List mylist){ mylist.add(new Banana()) ; return myList; } 

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