【问题标题】:Java error: The method XXX in the type XXX is not applicable for the arguments [duplicate]Java错误:XXX类型中的方法XXX不适用于参数[重复]
【发布时间】:2014-11-03 04:55:09
【问题描述】:

以下java文本中add方法有错误:

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

【问题讨论】:

  • 为什么要使用过时/遗留的java.util.Vector 集合(与具体问题无关)?
  • 请注意,&lt;&gt; 在这两种情况下都会扩展为 &lt;CellObject&gt;。两个向量具有相同的类型。唯一的区别是,在第一种情况下,您在 v 上使用了更通用的类型。

标签: java


【解决方案1】:
Vector<? extends CellObject>

告诉编译器:这是一个 Vector,它包含 CellObject(或 CellObject 本身)的 unknown 子类的实例。您可以放心地假设它包含 CellObject 的实例。但它可能是Vector&lt;CellObject&gt;,或Vector&lt;SubCellObject&gt;,或Vector&lt;SomeOtherCellObject&gt;:你只是不知道。

因此,为了保证集合的类型安全,您不能向该向量添加除 null 之外的任何内容。您真的不想将SubCellObject 添加到Vector&lt;SomeOtherCellObject&gt;

顺便说一句:Vector 自 Java 1.2 起已过时。我们在 Java 8。是时候继续前进了。而且您不应该使用原始类型来初始化您的变量。

【讨论】:

  • 感谢您的解释!这很容易。但是关于向量。我只需要无限存储、迭代收集和通过其他存储对象中的链接快速访问存储对象。在 Java 中以同样的效率使用什么更好、更现代?
  • ArrayList 是 Vector 的替代品。 Vector的javadoc引用:推荐使用ArrayList代替Vector
  • 是的,我知道。但是来自javadoc:
  • "请注意,这个实现是不同步的。"
  • @ABC 为什么需要同步?即使你这样做,那么你应该使用Collectionc.synchronizedList(new ArrayList&lt;&gt;())
【解决方案2】:

因为 Java 编译器不知道要分配给 v 的实际类型。

如果存储的对象是CellObject 的子类,那么它们与CellObject 的赋值兼容,所以你应该可以只使用Vector&lt;CellObject&gt;。这就是多态性的全部意义所在。它只是意味着:创建一个Vector,我可以在其中存储类型层次结构中CellObject 或以下的任何内容。

如果在这种情况下使用Vector&lt;? extends CellObject&gt; 是有意义的,它只能与Vector&lt;CellObject&gt; 表示相同。

【讨论】:

    猜你喜欢
    • 2016-10-28
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2021-09-02
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多