在此question中,TofuBeer在创建通用IterableEnumeration时遇到问题.
我仍然没有一件事.正如埃里克森有效指出的那样,真正的问题是:
You cannot specify a wildcard when constructing a parameterized type
但是删除声明中的通配符也不起作用:
final IterableEnumeration iteratable
= new IterableEnumeration(zipFile.entries());
导致以下错误:
Main.java:19: cannot find symbol
symbol : constructor IterableEnumeration(java.util.Enumeration)
location: class IterableEnumeration
final IterableEnumeration iteratable = new IterableEnumeration( zipFile.entries());
^
1 error
但是JavaSpecialist中的示例可以工作:
IterableEnumeration ie =
new IterableEnumeration(sv.elements());
我可以发现的唯一区别是,在JavaSpecialists博客中,枚举来自一个Vector,其签名为:
public Enumeration elements()
而失败的源于ZipFile,其签名为:
public Enumeration extends ZipEntry> entries()
最后,所有这些都被for-each构造和链接中建议的静态make方法吸收了
for(final ZipEntry entry : IterableEnumeration.make( zipFile.entries() )) {
if(!(entry.isDirectory())) {
names.add(entry.getName());
}
}
但!!该新闻简报的重点不是解决此问题,而是避免因为语法看起来很丑而需要指定泛型类型!
所以..我的问题是:
怎么了?
当参数是类型为 ?以及为什么make for-each构造会吞没这个问题?!
为什么这样做:
for(final ZipEntry entry : IterableEnumeration.make( zipFile.entries() )) {
但这行不通吗?
final IterableEnumeration 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 entries() {
final Vector vector = new Vector();
// why this works.
//final IterableEnumeration iteratable = new IterableEnumeration( vector.elements() );
// but this do not.
//final IterableEnumeration iteratable = new IterableEnumeration( zipFile.entries() );
// nor this
final IterableEnumeration iteratable = IterableEnumeration.make( zipFile.entries() );
// And what's with the for-each that doesn't care about the type?
final Set names = new HashSet();
for(final ZipEntry entry : IterableEnumeration.make( zipFile.entries() )) {
if(!(entry.isDirectory())) {
names.add(entry.getName());
}
}
return (names);
}
}
class IterableEnumeration implements Iterable {
private final Enumeration enumeration;
public IterableEnumeration(final Enumeration e) {
enumeration = e;
}
public Iterator iterator() {
return new Iterator() {
public boolean hasNext() {
return (enumeration.hasMoreElements());
}
public T next() {
return (enumeration.nextElement());
}
public void remove() {
throw new UnsupportedOperationException("Cannot remove via an Enumeration");
}
};
}
// As suggested by http://www.javaspecialists.eu/archive/Issue107.html
// but doesn't help with: final IterableEnumeration iteratable = IterableEnumeration.make( zipFile.entries() );
public static Iterable make(Enumeration en) {
return new IterableEnumeration(en);
}
}
我想了解它!