Java:Vector <derived>可以被称为Vector <base />?</derived>

时间:2011-02-06 20:43:37

标签: java inheritance overloading

我有一个类foo,一个源自bar的食物的类,我在foo中有一个方法需要另一个foo

boolean baz(foo c)
{
return (condition)?true:false;
}

我想为baz写一个重载,它接受一个Vector并在所有这些上调用baz - 比如

boolean baz(Vector<foo> v)
{
    for(int i=0;i<v.size();++i)
    {
    if baz(v.get(i))
        return true;
    }
    return false;
}

我想在矢量栏上使用调用此方法。我尝试按照我刚刚概述的方式编写这个,当我尝试在bar的向量上调用此方法时,我遇到编译器错误。

我错过了什么?

3 个答案:

答案 0 :(得分:6)

这是预期的,因为泛型是不变的。

List<Derived>不是List<Base>。想象一下,如果你打电话给那个方法,但在里面你打电话给list.add(anotherDerived)

您可以使用List<? extends Base>“修复”此问题。因此,您将无法添加元素,因此无法违反泛型合同。

(我使用List代替Vector,因为VectorArrayList取代(大多数情况下)

答案 1 :(得分:6)

只需声明如下方法:

boolean baz(Vector<? extends foo> v)

还有两点:

  • 对于以大写字母开头的类名,Java有一个非常强大的约定。阅读代码的任何人都会被小写的类名激怒。
  • Vector是一个过时的类,不应该再使用,除非你正在处理一个你不能控制的API(比如AWT的某些部分)。请改用ArrayList

答案 2 :(得分:1)

而不是:

boolean baz(Vector<foo> v)

boolean baz(Vector<? extends foo> v)