Java错误:XXX类型中的方法XXX不适用于参数

时间:2014-11-02 20:43:39

标签: java

以下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类。

2 个答案:

答案 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>相同。