[英]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.