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()
只能在列表是List
或List
才能工作。 以下是不同类型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 extends T> 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 extends Parent>
List extends Parent>
表示“只包含一些未知的Parent
子类的实例的列表” – 由于你不知道它是什么子类,你不能在列表中添加除null
之外的任何内容(你可以从中获取Parent
实例)但是,它)。
如果你有一个特定的子类Child
要添加到列表中的实例,那么你真正需要的是:
public List myfunction(List mylist)
继Jon Skeet在另一个问题上的例子之后,让我们说你使用了
public List extends Fruit> myfunction(List extends Fruit> 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
…