Нельзя указывать подстановочный знак при построении параметризованного типа. Это правильный синтаксис:
iteratable = new IterableEnumeration<ZipEntry>(enumeration);
Как вы заметили, существует трудность в реализации Iterable
с Enumeration
, потому что Enumeration
является одноразовым использованием, в то время как код может полагаться на Iterable
для создания столько свежих Iterator
объектов, сколько пожелает. Вы могли бы безопасно использовать это в улучшенных циклах for, но было бы небезопасно передавать такой Iterable
любому другому методу.
Оскар прав, вышеуказанного изменения недостаточно. Я упустил из виду тот факт, что базовый enumeration
является "? extends ZipEntry
". Кроме того, внесите следующие изменения:
class IterableEnumeration<T>
implements Iterable<T>
{
private final Enumeration<? extends T> enumeration;
public IterableEnumeration(final Enumeration<? extends T> e)
{
enumeration = e;
}
...
и
class EnumerationIterator<T>
implements Iterator<T>
{
private final Enumeration<? extends T> enumeration;
public EnumerationIterator(final Enumeration<? extends T> e)
{
enumeration = e;
}
...
Эти изменения в основном означают, что "IterableEnumeration<T>
может сотрудничать с Enumeration
любого подтипа T
."