使用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。我非常感谢你们所提供的任何帮助!
答案 0 :(得分:2)
您需要接受协变通用参数:
public void addAll(Collection<? extends Superclass> c)
中看到这一点
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;
}