另一个示例非常复杂,我一点也不了解,我的问题在某种程度上是相似的,但是正如我所说的那样,它更简单并且可能会给出更简单的答案
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()可以使用多种列表来调用,而添加new Child()只能在列表为a List<Parent>或a时起作用List<Child>。这是一个不同种类的列表的示例:
new Child()
myList
myfunction()
List<Parent>
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()
OtherChild
Child
附录
如果您希望myfunction()能够向其中添加元素,则myList需要使用工厂(因为Java不允许new T()T为类型参数,这是由于类型擦除所致)。以下是如何myfunction()应该是这样的:
new T()
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(); } }); }