通过收集<;子类>;进入一个需要集合的函数<;基类>;在Java中失败
可能重复:通过收集<;子类>;进入一个需要集合的函数<;基类>;在Java中失败,java,inheritance,collections,Java,Inheritance,Collections,可能重复: 如果我有一个抽象基类BaseClass,并且我编写了一个函数,期望Collection作为其参数,那么使用类子类的Collection对该函数的调用将扩展BaseClass编译失败 在基类中: public void addLots(Collection<BaseClass> collection) { for(BaseClass yourbase : collection) { us.add(yourbase) //what you say!
如果我有一个抽象基类
BaseClass
,并且我编写了一个函数,期望Collection
作为其参数,那么使用类子类的Collection
对该函数的调用将扩展BaseClass
编译失败
在基类中:
public void addLots(Collection<BaseClass> collection) {
for(BaseClass yourbase : collection) {
us.add(yourbase) //what you say!!
}
}
public void addLots(集合){
for(基类yourbase:collection){
加上(你的基础)//你说什么!!
}
}
在子类中:
public void addMoreLots(Collection<SubClass> collection) {
addLots(collection); //FAILS TO COMPILE
}
public void addMoreLots(集合){
addLots(collection);//编译失败
}
现在我想我可以明白为什么了:
Collection
不是Collection
的子类。进行此调用的正确方法是什么?仅在编译时检查集合
,运行时检查集合
,不检查集合,因此这样做是为了保护接收错误类型对象的集合。
这样试试
public void addLots(集合){}
或
public void addLots(CollectionCollection
仅在编译时检查,在运行时检查而不是,因此这样做是为了保护接收错误类型对象的集合。
这样试试
public void addLots(集合){}
或
public void addLots(集合您可以使用
public void addLots(Collection<? extends BaseClass> collection) {
}
public void addLots(集合您可以使用
public void addLots(Collection<? extends BaseClass> collection) {
}
public void addLots(集合)
您可以调用add(即,您可以执行collection.add()
)
您可以调用add(即,您可以执行collection.add()
)。在紧急情况下,Collections.unmodifiableCollection(collection)
可以返回集合
(当然,这会使集合不可修改,但这就是将集合
视为集合的安全之处。)在紧急情况下,集合。不可修改的集合(集合)
可以返回一个集合
(当然,它使集合不可修改,但这就是将集合
视为集合
)的安全性。我已经解决了,请参见下文,但谢谢:)我已经算出了,请看下面,但谢谢:)我已经算出了,并发布了我自己的答案,但谢谢:)@Andrewyld,没有什么比自己找到答案更有趣、更令人鼓舞的了……继续努力……但请注意我已经提到了这两种方法……我已经找到了答案并发布了自己的答案,但谢谢:)@Andrewyld,没有什么比自己找到答案更有趣、更令人鼓舞的了。。。。。。坚持下去。。。但是请注意,我已经提到了这两种方法……谢谢——虽然我找不到,但我认为这解决了一个不同的问题(更多地关注“我如何做到这一点”,而不是关注“为什么数组与集合不同”)。这一假设适用于任何泛型,例如WeakReference
。谢谢——我找不到它,我认为这解决了一个不同的问题(更多地关注“我如何做到这一点”,而不是关注“为什么数组不同于集合”)。这可能适用于任何泛型,例如WeakReference
。
public void addLots(Collection<BaseClass> collection) {
}
public void addLots(Collection<? extends BaseClass> collection) {
}
public void addLots(Collection<? super SubClass> collection) {
}