如在本一般性问题的一个实际的例子,我想实现在Set
接口containsAll
法接口实现与方法参数超
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;
}
你可以发布Eclipse给你的错误吗?在IDEA中为我工作。 – 2010-10-16 16:11:07
@Nikita:编辑。soooo ...它可能只是一个Eclipse的东西? – Carl 2010-10-16 16:15:25
这是一个术语噩梦。我逃避了这些挑战。 – skaffman 2010-10-16 16:27:03