通过收集<;子类>;进入一个需要集合的函数<;基类>;在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(Collection
Collection
仅在编译时检查
运行时检查
而不是
,因此这样做是为了保护接收错误类型对象的集合。

这样试试

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) {
}