以下java文本添加方法中存在错误:
import java.util.Vector;
public class test {
Vector<? extends CellObject> v = new Vector<>();
class Cell extends CellObject {
// some definitions here
public Cell() {
v.add(this);
}
}
}
为什么我不能使用有界通配符?我的问题是,在创建向量 v 的那一刻(并且在某处)我真的不知道将来存储在向量中的子类。
我知道在案件中
Vector<CellObject> v = new Vector<>();
没有错误,但是矢量的组件不属于CellObject类。
答案 0 :(得分:4)
Vector<? extends CellObject>
告诉编译器:这是一个Vector,它包含CellObject(或CellObject本身)的未知子类的实例。您可以放心地假设它包含CellObject的实例。但它可以是Vector<CellObject>
,Vector<SubCellObject>
或Vector<SomeOtherCellObject>
:您只是不知道。
因此,为了保证集合的类型安全性,您不能向该向量添加除null之外的任何内容。您真的不想将SubCellObject
添加到Vector<SomeOtherCellObject>
。
BTW:自Java 1.2以来,Vector已经过时了。我们是Java 8.现在是时候继续前进了。并且您不应该使用原始类型来初始化您的可变性。
答案 1 :(得分:1)
因为Java编译器不知道要分配给v
的实际类型。
如果存储的对象是CellObject
的子类,那么它们与CellObject
的分配兼容,因此您应该只能使用Vector<CellObject>
。这是多态性的全部要点。它只是意味着:创建一个Vector
,我可以在类型层次结构中存储CellObject
或更低的任何内容。
如果在该上下文中使用Vector<? extends CellObject>
有意义,那么它只能与Vector<CellObject>
相同。