In this question , TofuBeer was having trouble creating a generic one IterableEnumeration.
A response from jcrossley3 pointed to this link http://www.javaspecialists.eu/archive/Issue107.html , which pretty much solved the problem.
There is one more thing that I do not understand. The real problem, as Erickson effectively noted, was this:
You cannot specify a wildcard when constructing a parameterized type
But deleting the template in the declaration didn't work either:
final IterableEnumeration<ZipEntry> iteratable
= new IterableEnumeration<ZipEntry>(zipFile.entries());
Results with the following error:
Main.java:19: cannot find symbol
symbol : constructor IterableEnumeration(java.util.Enumeration<capture
location: class IterableEnumeration<java.util.zip.ZipEntry>
final IterableEnumeration<ZipEntry> iteratable = new IterableEnumeration<ZipEntry>( zipFile.entries());
^
1 error
But the samples in the JavaSpecialist work:
IterableEnumeration<String> ie =
new IterableEnumeration<String>(sv.elements());
The only difference I can notice is that the JavaSpecialists blog Enumerationcomes from Vector, whose signature is:
public Enumeration<E> elements()
, , ZipFile, :
public Enumeration<? extends ZipEntry> entries()
, for-each ,
for(final ZipEntry entry : IterableEnumeration.make( zipFile.entries() )) {
if(!(entry.isDirectory())) {
names.add(entry.getName());
}
}
!! , , , !!
, :
?
IterableEnumeration, Enumeration, <? extends SomeClass>? make ?!!!
:
for(final ZipEntry entry : IterableEnumeration.make( zipFile.entries() )) {
?
final IterableEnumeration<ZipEntry> iteratable
= IterableEnumeration.make( zipFile.entries() );
() TofuBeer:
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.Vector;
public class Main {
private ZipFile zipFile;
public Set<String> entries() {
final Vector<ZipEntry> vector = new Vector<ZipEntry>();
final IterableEnumeration<ZipEntry> iteratable = IterableEnumeration.make( zipFile.entries() );
final Set<String> names = new HashSet<String>();
for(final ZipEntry entry : IterableEnumeration.make( zipFile.entries() )) {
if(!(entry.isDirectory())) {
names.add(entry.getName());
}
}
return (names);
}
}
class IterableEnumeration<T> implements Iterable<T> {
private final Enumeration<T> enumeration;
public IterableEnumeration(final Enumeration<T> e) {
enumeration = e;
}
public Iterator<T> iterator() {
return new Iterator<T>() {
public boolean hasNext() {
return (enumeration.hasMoreElements());
}
public T next() {
return (enumeration.nextElement());
}
public void remove() {
throw new UnsupportedOperationException("Cannot remove via an Enumeration");
}
};
}
public static <T> Iterable<T> make(Enumeration<T> en) {
return new IterableEnumeration<T>(en);
}
}
!