В качестве практического примера общего вопроса в предмете я хотел бы реализовать метод 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;
}