![](/img/trans.png)
[英]Java: Is casting to generic type in parent class safe when generic is <T extends Parent>?
[英]Java: Can't to generic List<? extends Parent> mylist
另一个示例非常复杂,我一点也不理解,我的问题在某种程度上是相似的,但是正如我所说的那样,它更简单并且可能会给出更简单的答案
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()
,而仅当列表为List<Parent>
或List<Child>
才能添加new 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>());
在最后一行中,使用OtherChild
对象列表调用myfunction()
。 显然,将Child
对象添加到此类列表中是非法的。 编译器通过拒绝myfunction()
的定义来防止这种情况
附录
如果希望myfunction()
能够向myList
添加元素, 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;
}
现在,它的用法是:
public static class ChildOfOtherChild extends OtherChild {}
myfunction(new ArrayList<OtherChild>(), new Factory<ChildOfOtherChild>() {
@Override public ChildOfOtherChild create() { return new ChildOfOtherChild(); }
});
}
什么List<? extends Parent>
List<? extends Parent>
的意思是“包含的一些未知的子类的实例只列出Parent
” -因为你不知道什么继承它是,但你不能添加任何null
的列表(你可以得到Parent
的情况下,但是)。
如果您有一个特定的子类Child
想要将其实例添加到列表中,那么您真正需要的是:
public List<Child> myfunction(List<Child> mylist)
继另一个问题中的乔恩·斯基特(Jon Skeet)的示例之后,假设您使用了
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;
}
如何添加return
语句,或声明方法以返回void
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.