【问题标题】:Unknown compilation error with generics in JavaJava中泛型的未知编译错误
【发布时间】:2012-10-17 05:53:12
【问题描述】:

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

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&lt;capture#1-of ? extends ZipEntry&gt; to Enumeration&lt;ZipEntry&gt;

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

如果有帮助,我正在使用带有 Eclipse Indigo 64 位的 Java 7.03。

【问题讨论】:

  • 哇,我不敢相信我忘记发布错误代码了!谢谢你的收获。

标签: java eclipse compiler-errors eclipse-indigo


【解决方案1】:

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

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

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

【讨论】:

  • JarEntry 扩展了 ZipEntry,所以下面的代码是合法的:ZipEntry zip = new JarEntry()。这是逆变,在java中是合法的。 OP 在问你为什么不能使用 Enumeration 来设置一个 Enumeration 变量...根据逆变的逻辑应该是合法的。
  • 协方差通常适用于对象,但不适用于泛型。
【解决方案2】:

仔细看(源代码),返回Enumeration&lt;ZipEntry&gt;,如下:

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

但返回类型被声明为public Enumeration&lt;? extends ZipEntry&gt; entries() {放松对返回类型的限制。如果您希望通过Zipfile 的自定义子类覆盖entries() 方法,您可能希望使用ZipEntry 的子类之一 作为同一方法的返回类型,即ZipEntry

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

  @SuppressWarnings("rawtypes")
  Enumeration entries = zip_file.entries();

【讨论】:

    【解决方案3】:
    Make sure that the file exists and is accessible, you can also try this 
    
    Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip_file.entries(); 
    

    【讨论】:

      【解决方案4】:

      使用&lt;Z extends ZipEntry&gt; 并将方法中的所有? 实例(如果有)替换为Z。你不限于Z,你可以使用任何你喜欢的字母。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-30
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        相关资源
        最近更新 更多