Реализация интерфейса с суперклассами аргументов метода

В качестве практического примера общего вопроса в теме, я ' я хотел бы реализовать метод containsAll в интерфейсе Set с

public boolean containsAll(Iterable<?> c) { /* ... */ }

Я полагаю, что это должно быть разрешено, поскольку Collection Iterable это означает, что такой containsAll будет покрывать требования интерфейса. Точно так же, в более общем плане, возможность реализовать интерфейсы с суперклассами аргументов кажется, что это должно работать.

Однако Eclipse говорит, что нет (не пробовал просто javac прямо) - может кто-нибудь объяснить причину этого? Я уверен, что в спецификации есть что-то, что делает его таким, какой он есть, но я также хотел бы понять мотивацию требований. Или мне не хватает чего-то вроде Iterable , не являющегося суперклассом Collection ?

В качестве побочного вопроса - учитывая, что я ' m объявляя два метода, будет ли метод с сигнатурой Iterable всегда предпочтительнее для вызовов с аргументом Collection ?

Ошибка Eclipse:

Если я удалю метод с Подпись коллекции , просто оставив подпись Iterable (см. После ошибки), я получаю следующее:

Тип BitPowerSet должен реализовывать унаследованный абстрактный метод Set .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;
}
6
задан Carl 16 October 2010 в 16:14
поделиться