(1) Да, поскольку PowerList<T> implements IPowerList<T>
, он должен реализовывать Iterator<T> iterator()
(или возвращать подтип Iterator<T>
).
(2) Оставьте наследование равным Iterable<T>
, чтобы вы могли инкапсулировать свои поля (они в любом случае являются частными) и экспортировать только итератор. Во-вторых, вы можете решить, какой и какой итератор вы экспортируете, и будете более гибкими в будущем (например, измените порядок перечисления). Наконец, вы можете подумать о том, чтобы не расширять Iterable для вашего IPowerList, если это не имеет ничего общего с Iterations (мне так кажется), а вместо этого заставить PowerList реализовывать оба интерфейса (множественное наследование на интерфейсах разрешено в Java).
(3) Например, когда вы создаете новую коллекцию, например, ваш набор наборов. Или когда вы хотите изменить поведение итератора, например, порядок перечисления или может ли итератор добавлять и удалять элементы. Например, у меня есть древовидная структура, которая может возвращать кучу разных итераторов (и реализует итератор и несколько похожих интерфейсов).