小编典典
我相信您正在寻找一种采用列表的方法,向其中添加一些内容,然后返回列表。该列表是通用的,您希望返回类型与参数的类型匹配。
通常情况下,这是您的操作方法:
public List myfunction(List myList) {
... // Add something to myList
return myList;
}
具体来说,您尝试添加new Child()到中myList。这行不通。myfunction()可以使用多种列表来调用,而添加new
Child()只能在列表为a List或a时起作用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()用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(); }
});
}
2020-11-26