0

可能重复:
将 List<SubClass> 转换为 List<BaseClass> 的最有效方法
为什么多态性不会以相同的方式处理泛型集合和普通数组?

如果我有一个抽象基类BaseClass并且我编写了一个期望作为其参数的函数,那么使用类的 aCollection<BaseClass>调用该函数将无法编译。Collection<SubClass>SubClass extends BaseClass

在基类中:

public void addLots(Collection<BaseClass> collection) {
    for(BaseClass yourbase : collection) {
        us.add(yourbase) //what you say!!
    }
}

在子类中:

public void addMoreLots(Collection<SubClass> collection) {
    addLots(collection); //FAILS TO COMPILE
}

现在我想我明白为什么会这样Collection<SubClass>了:不是Collection<BaseClass>. 进行此调用的正确方法是什么?

4

5 回答 5

2

在紧要关头,Collections.unmodifiableCollection(Collection<SubClass>)可以返回一个Collection<BaseClass>. (当然,它使集合不可修改,但这就是将 aCollection<SubClass>视为 a 的安全原因Collection<BaseClass>。)

于 2012-09-03T21:34:41.403 回答
1

<? extends BaseClass>应该替换<BaseClass>. 的正确语法addLots是:

public void addLots(Collection<? extends BaseClass> collection) {
    for(BaseClass yourbase : collection) {
        us.add(yourbase) //what you say!!
    }
}
于 2012-09-03T17:00:08.993 回答
1

Collections仅在编译时和运行时进行检查not,因此这样做是为了保护一个包含错误类型对象的集合。

试试这个方法...

public <T extends BaseClass> void addLots(Collection<T> collection){ }

或者

public void addLots(Collection<? extends BaseClass> collection) {}

于 2012-09-03T17:01:42.383 回答
1

您可以使用

public void addLots(Collection<? extends BaseClass> collection) {
}

代替

public void addLots(Collection<BaseClass> collection) {
}

这表示Collection扩展基类的类型可以是参数。

于 2012-09-03T17:04:37.907 回答
0
public void addLots(Collection<? extends BaseClass> collection) {
}

但是有了这个你不能调用添加到集合(即你不能这样做collection.add()),
但是在这个

public void addLots(Collection<? super SubClass> collection) {
}

你可以调用 add (即你可以做collection.add())。

于 2012-09-03T18:02:26.013 回答