В качестве практического примера общего вопроса в теме, я ' я хотел бы реализовать метод containsAll
в интерфейсе Set
с
public boolean containsAll(Iterable<?> c) { /* ... */ }
Я полагаю, что это должно быть разрешено, поскольку Collection
Iterable
это означает, что такой containsAll
будет покрывать требования интерфейса. Точно так же, в более общем плане, возможность реализовать интерфейсы с суперклассами аргументов кажется, что это должно работать.
Однако Eclipse говорит, что нет (не пробовал просто javac прямо) - может кто-нибудь объяснить причину этого? Я уверен, что в спецификации есть что-то, что делает его таким, какой он есть, но я также хотел бы понять мотивацию требований. Или мне не хватает чего-то вроде Iterable >
, не являющегося суперклассом Collection >
?
В качестве побочного вопроса - учитывая, что я ' m объявляя два метода, будет ли метод с сигнатурой Iterable
всегда предпочтительнее для вызовов с аргументом Collection
?
Ошибка Eclipse:
Если я удалю метод с Подпись коллекции
, просто оставив подпись Iterable
(см. После ошибки), я получаю следующее:
Тип BitPowerSet должен реализовывать унаследованный абстрактный метод Set
Точная реализация:
@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;
}