作为该主题中一般问题的一个实际示例,我想containsAll
在Set
与
public boolean containsAll(Iterable<?> c) { /* ... */ }
我想这应该是允许的,因为Collection
是Iterable
意味着这种containsAll
将涵盖接口要求。同样,更普遍的是能够使用参数超类实现接口似乎应该起作用。
但是,Eclipse却说没有办法(没有尝试过Javac直升法)-有人可以解释原因吗?我确定规范中有某些内容可以使它保持现状,但是我也想了解需求的动机。还是我缺少像Iterable<?>
不是超类的东西Collection<?>
?
附带的问题-给定我要声明的两个方法Iterable
,带有Collection
参数的方法是否总是在带有参数的调用中优先使用?
Eclipse错误:
如果我删除带有Collection
签名的方法,只留下Iterable
一个(请参阅后面的错误),则会得到以下信息:
The type BitPowerSet must implement the inherited abstract method Set<Long>.containsAll(Collection<?>)
确切的实现是:
@Override public boolean containsAll(Collection<?> c) {
for (Object o : c) if (!contains(o)) return false;
return true;
}
public boolean containsAll(Iterable<?> c) {
for (Object o : c) if (!contains(o)) return false;
return true;
}
我对为什么Java有此限制的猜测是,您有:
class A {
void foo(String s) { ... }
}
class B extends A {
// Note generalized type
@Override void foo(Object s) { ... }
}
现在,如果您有class C extends B
并且要覆盖foo
,则不清楚应该采用什么参数。
例如,首先说C扩展了A,直接覆盖A void foo(String s)
,然后更改为扩展B。在这种情况下,C的现有覆盖foo
无效将变为无效,因为B foo
应当能够处理所有Object
s,而不仅仅是String
s。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句