麻烦当Vector在一个包含的类中时,使用Vector的addAll()函数

时间:2011-12-27 00:47:16

标签: java vector subclass

使用Java 6 SE,我有一个包含Vector的类。有一个类方法只是调用包含的Vector的addAll()方法,每个方法都有相同的参数。向量可以是“超类”类型或类型“子类”,我希望addAll()方法支持两者。整个设置可能如下所示:

public class VectorAContainer(){
    this.vectorA = new Vector<Superclass>();
}

public void addAll(Vector<Superclass> vector){
    this.vectorA.addAll(vector);
}

然后我想调用一行代码:

VectorAContainer container = new VectorAContainer();
container.addAll(vectorB); //where vectorB is a Vector<Subclass>

问题是,Eclipse给出了以下错误:

  

“类型中的方法addAll(Vector&lt; Superclass&gt;)   VectorAContainer不适用于参数   (矢量&lt;子类&GT)。“

奇怪的是,我发现如果addAll()不在类中,则可以工作:

//No container with an addAll(), calling directly on vectorA
this.vectorA.addAll(vectorB); //No errors!

我认为上述两种情况没有区别。我想获得第一种工作方式,因为我有一个更复杂的类,其中包含一个像上面那样的Vector。我非常感谢你们所提供的任何帮助!

2 个答案:

答案 0 :(得分:2)

您需要接受协变通用参数:

public void addAll(Collection<? extends Superclass> c)

您可以在declaration of addAll

中看到这一点
boolean addAll(Collection<? extends E> c)

答案 1 :(得分:0)

这是因为Superclass是一个下限注释,意思是超级向量的类。如果vectorB是Vector的子类,那么它将无法工作。 AbstractList和AbstractCollection是Super to Vector。我相信你想用。     public void addAll(Vector<? extends Vector> vector){ vectorA.addAll(vector); }

<强> P.S。 Vector是一个过时的类。如果您不需要线程安全实现,则应使用ArrayList。

* P.P.S。除非有两个具有相同名称的变量(例如

),否则不需要使用“this”

private Variable variableA;

public void example(Variable variableA){

this.variableA = variableA;

}