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