Java:Can Vector<派生>被称为Vector ?派生>
我有一个类 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是预期的,因为泛型是不变的。
List
不是List
。想象一下,如果您调用该方法,但在其中调用list.add(anotherDerived)
。您可以使用
List
。因此,您将无法添加元素,因此将无法违反泛型合同。(我使用
List
而不是Vector
,因为Vector
在大多数情况下被ArrayList
替换)This is expected, because generics are invariant.
List<Derived>
is notList<Base>
. Imagine if you call that method, but inside it you calllist.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 ofVector
, becauseVector
is replaced (in most cases) byArrayList
)只需像这样声明方法即可:
另外两点:
Vector
是一个过时的类,不应再使用,除非您正在处理一个可以使用但您无法控制的 API(如 AWT 的某些部分)。请改用 ArrayList。Just declare the method like this:
Two additional points:
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). UseArrayList
instead.而不是:
尝试
instead of :
try