我有一个类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的向量上调用此方法时,我遇到编译器错误。
我错过了什么?
答案 0 :(得分:6)
这是预期的,因为泛型是不变的。
List<Derived>
不是List<Base>
。想象一下,如果你打电话给那个方法,但在里面你打电话给list.add(anotherDerived)
。
您可以使用List<? extends Base>
“修复”此问题。因此,您将无法添加元素,因此无法违反泛型合同。
(我使用List
代替Vector
,因为Vector
被ArrayList
取代(大多数情况下)
答案 1 :(得分:6)
只需声明如下方法:
boolean baz(Vector<? extends foo> v)
还有两点:
Vector
是一个过时的类,不应该再使用,除非你正在处理一个你不能控制的API(比如AWT的某些部分)。请改用ArrayList
。答案 2 :(得分:1)
而不是:
boolean baz(Vector<foo> v)
试
boolean baz(Vector<? extends foo> v)