java泛型报错_如何解决此Java泛型通配符错误?

在此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);

}

}

我想了解它!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值