繁体   English   中英

Java中的泛型有未知的编译错误

[英]Unknown compilation error with generics in Java

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

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> Type mismatch: cannot convert from Enumeration<capture#1-of ? extends ZipEntry> to Enumeration<ZipEntry>

为了得到上面的代码进行编译,我不得不替换entries声明来使用泛型<? extends ZipEntry> <? extends ZipEntry> 为什么我要这样做? ZipEntry不扩展ZipEntry吗? (这不是真的吗?)为什么编译器抱怨这个?

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

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

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

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

问题是ZipFile.entries()返回Enumeration<? extends ZipFile> Enumeration<? extends ZipFile>

这里

泛型不是协变的

“虽然你可能会发现将集合视为数组的抽象是有帮助的,但它们有一些特殊的属性,集合不具备这些特性.Java语言中的数组是协变的 - 这意味着如果Integer扩展了Number(它确实如此),那么不仅Integer也是一个数字,而且Integer []也是一个Number [],你可以自由地传递或分配一个调用Number []的Integer []。(更正式的是,如果是一个超类型的Integer,然后Number []是一个Integer []的超类型。)你可能会认为泛型类型也是如此 - List是List的超类型,你可以传递一个List的List预计。不幸的是,它不会这样。“

Enumeration<? extends ZipFile> Enumeration<? extends ZipFile>并不意味着Enumeration<? extends ZipFile>的任何类型的集合......而是一个包含扩展ZipFile的特定类型的集合。 即使将SayFile隐式地转换为ZipFile( ZipFile z = new JarFile(); l从Enumeration<JarFile>Enumeration<ZipFile>也是不合法的。

如果仔细观察(源代码) ,它只返回Enumeration<ZipEntry> ,如下所示:

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

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

如果您不想使用泛型,您可能希望编写为:

  @SuppressWarnings("rawtypes")
  Enumeration entries = zip_file.entries();
Make sure that the file exists and is accessible, you can also try this 

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM