作为该主题中一般问题的一个实际示例,我想在接口中实现该containsAll
方法Set
public boolean containsAll(Iterable<?> c) { /* ... */ }
我认为这应该是允许的,因为Collection
这Iterable
意味着这containsAll
将涵盖接口要求。同样,更一般地说,能够使用参数超类实现接口似乎应该可以工作。
但是,Eclipse 说没有办法(还没有直接尝试过 javac)——有人能解释一下原因吗?我确信规范中有一些东西使它成为这样,但我也想了解需求的动机。还是我错过了像Iterable<?>
不是超类这样的东西Collection<?>
?
作为一个附带问题 - 鉴于我声明了两种方法,带有签名的方法在带有参数Iterable
的调用中总是首选吗?Collection
日食错误:
如果我删除带有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;
}