3

以下编译错误对我来说毫无意义,我希望有人能够阐明:

static public void main(String args[]) throws ZipException, IOException
{
    File file = new File("C:\\temp");
    ZipFile zip_file = new ZipFile(file);
    Enumeration<ZipEntry> entries = zip_file.entries();
}   

我收到以下错误:Type mismatch: cannot convert from Enumeration<capture#1-of ? extends ZipEntry> to Enumeration<ZipEntry>

为了编译上面的代码,我不得不替换entries声明以使用泛型<? extends ZipEntry>。为什么我必须这样做?ZipEntry 不扩展 ZipEntry 吗?(这不是空洞的吗?)为什么编译器会抱怨呢?

如果有帮助,我将使用 Java 7.03 和 Eclipse Indigo 64 位。

4

4 回答 4

5

ZipFile.entries()返回扩展ZipEntry类型的枚举,但不限于ZipEntry自身,因此您需要使用:

Enumeration<? extends ZipEntry> entries = zip_file.entries();

这允许在枚举中使用其他类型,例如JarEntry对象。ZipEntry

于 2012-10-26T23:51:28.353 回答
2

如果你仔细看(源代码),它只返回Enumeration<ZipEntry>如下:

     return new Enumeration<ZipEntry>() {
            private int i = 0;
            public boolean hasMoreElements() {
            .....
            .....

但是声明返回类型是public Enumeration<? extends ZipEntry> entries() {为了放宽对返回类型的限制。如果您希望entries()通过自定义子类覆盖方法Zipfile,您可能希望使用相同方法的作为返回类型的子类之一,即ZipEntryZipEntry

如果你不想使用泛型,你可能想写成:

  @SuppressWarnings("rawtypes")
  Enumeration entries = zip_file.entries();
于 2012-10-27T00:10:51.123 回答
1
Make sure that the file exists and is accessible, you can also try this 

Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip_file.entries(); 
于 2012-10-27T00:03:43.383 回答
1

使用<Z extends ZipEntry>并替换?方法中的所有实例(如果有),使用Z. 你不限于Z,你可以使用任何你喜欢的字母。

于 2012-10-27T00:04:21.853 回答