Java:Can Vector<派生>被称为Vector

发布于 2024-10-16 16:39:54 字数 454 浏览 1 评论 0原文

我有一个类 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 向量上调用此方法时,出现编译器错误。

我缺少什么?

I've got a class foo, a class that derives from food called bar, and I've got a method in foo that takes another foo

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

I want to write an overload for baz that takes a Vector and calls baz on all of them -- something like

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

and I want to use call this method on a Vector of bar. I tried writing this in the way I just outlined, and I get compiler errors when I try to call this method on a vector of bar.

What am I missing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

夏至、离别 2024-10-23 16:39:54

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

List 不是 List。想象一下,如果您调用该方法,但在其中调用 list.add(anotherDerived)

您可以使用 List。因此,您将无法添加元素,因此将无法违反泛型合同。

(我使用 List 而不是 Vector,因为 Vector 在大多数情况下被 ArrayList 替换)

This is expected, because generics are invariant.

List<Derived> is not List<Base>. Imagine if you call that method, but inside it you call list.add(anotherDerived).

You can "fix" this by using List<? extends Base>. Thus you won't be able to add elements, and hence won't be able to violate the generics contract.

(I'm using List instead of Vector, because Vector is replaced (in most cases) by ArrayList)

仅冇旳回忆 2024-10-23 16:39:54

只需像这样声明方法即可:

boolean baz(Vector<? extends foo> v)

另外两点:

  • Java 对于以大写字母开头的类名有非常严格的约定。任何阅读你的代码的人都会对小写的类名感到恼火。
  • Vector 是一个过时的类,不应再使用,除非您正在处理一个可以使用但您无法控制的 API(如 AWT 的某些部分)。请改用 ArrayList。

Just declare the method like this:

boolean baz(Vector<? extends foo> v)

Two additional points:

  • Java has an extremely strong convention for class names beginning with an uppercase letter. Anyone reading your code will be irritated by lowercase class names.
  • Vector is an obsolete class that should not be used anymore unless you're dealing with an API that does and which you don't control (like some parts of AWT). Use ArrayList instead.
时光无声 2024-10-23 16:39:54

而不是:

boolean baz(Vector<foo> v)

尝试

boolean baz(Vector<? extends foo> v)

instead of :

boolean baz(Vector<foo> v)

try

boolean baz(Vector<? extends foo> v)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文