Java:Can';t到通用列表<;?扩展父级>;迈利斯特
另一个例子很复杂,我一点也不理解,我的问题在某种程度上是类似的,但正如我所说的,它更简单,可能会得到更简单的答案Java:Can';t到通用列表<;?扩展父级>;迈利斯特,java,list,generics,inheritance,collections,Java,List,Generics,Inheritance,Collections,另一个例子很复杂,我一点也不理解,我的问题在某种程度上是类似的,但正如我所说的,它更简单,可能会得到更简单的答案 public List<? extends Parent> myfunction(List<? extends Parent> mylist){ mylist.add(new Child()) ; //Doesn't Compile } public ListWhatList如何添加return语句,或者声明返回void的方法……我相信您正在
public List<? extends Parent> myfunction(List<? extends Parent> mylist){
mylist.add(new Child()) ; //Doesn't Compile
}
public ListWhatList如何添加return
语句,或者声明返回void
的方法……我相信您正在寻找一种方法,它接受一个列表,向其中添加一些内容,然后返回列表。该列表是泛型的,您希望返回类型与参数的类型匹配
在一般情况下,您可以这样做:
public <T extends Parent> List<T> myfunction(List<T> myList) {
... // Add something to myList
return myList;
}
在最后一行中,使用OtherChild
对象的列表调用myfunction()
。显然,将子对象添加到这样的列表中是非法的。编译器通过拒绝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;
}
公共接口工厂{
公共不创建();
}
公共列表myfunction(列表myList,
工厂以Jon Skeet在中的示例为例,假设您使用
public List<? extends Fruit> myfunction(List<? extends Fruit> mylist){
mylist.add(new Apple()) ; //Doesn't Compile
return myList;
}
public list向我们展示如何声明子类和父类。另外,我建议任何类名都使用首字母大写。该示例仅用于解释,因为您可以看到我使用了父类和子类类比,请随意编辑。这也是这里的问题。您在这里说什么?我指的是(6年前)这段代码没有编译的最明显原因(函数有一个返回类型,但没有返回语句)。这样更好,但如何创建类型为T的元素?这在Java中不起作用。您不能执行new T()
,其中T是一个类型参数。您可以使用工厂来克服这一点(我正在为答案编写一个附录,其中讨论了这一点)“不能添加任何内容”并不完全正确。您可以添加null
。
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(); }
});
}
public List<? extends Fruit> myfunction(List<? extends Fruit> mylist){
mylist.add(new Apple()) ; //Doesn't Compile
return myList;
}
List<Banana> bananas = new ArrayList<Banana>();
bananas = myfunction(bananas);
public List<Fruit> addApple(List<Fruit> mylist){
mylist.add(new Apple()) ;
return myList;
}
public List<Fruit> addBanana(List<Fruit> mylist){
mylist.add(new Banana()) ;
return myList;
}