首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Iterator<?>与Iterator在java中的比较

Iterator<?>与Iterator在java中的比较
EN

Stack Overflow用户
提问于 2012-03-05 19:54:15
回答 3查看 5.7K关注 0票数 4

可能重复:

What is a raw type and why shouldn't we use it?

在描述中,这个问题几乎是自成一体的:

代码语言:javascript
复制
Iterator<?>

代码语言:javascript
复制
Iterator

java中的对象?它们都迭代对象类型,对吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-05 20:03:54

不是的。Iterator<?>?(从Object派生的某种类型)上迭代,而Iterator只提供Object的,这是Java中的泛型支持。

什么是?类型?这是个很棒的问题。

在Java 5之前的糟糕日子里,您有非类型化集合和非类型化迭代器。因此,您的集合中将包含Objects,并且必须手动转换它们。例如:

代码语言:javascript
复制
List foo = new ArrayList();
foo.add("Foo!");

for(Iterator i = foo.iterator(); i.hasNext(); )
{
    Object element = i.next();

    System.out.println((String)element);
}

注意到那个演员了吗?这是因为我们只是把Object塞进列表中,我们必须自己做所有的事情。只要一个List就没那么糟了,但是想象一下地图中包含了一个.好吧,你明白了。你正在下地狱,你可能很快就不知道你是在看一张从StringInteger的地图,还是从IntegerString的另一张地图。

在Java 5中,您可以使用泛型,所以现在可以这样说:

代码语言:javascript
复制
List<String> foo = new ArrayList();
foo.add("Foo!");

for(Iterator<String> i = foo.iterator(); i.hasNext(); )
{
    String element = i.next();

    System.out.println(element);
}

注意到演员是没有必要的?当我们使用List<String>时,我们可以使用Iterator<String>并具有某种类型安全性。

当您开始使用更复杂的数据结构进行操作时,这是非常有益的,例如:

代码语言:javascript
复制
Map<String, Map<String, Map<String, SomeRandomObject>>> complexMap;
票数 11
EN

Stack Overflow用户

发布于 2012-03-05 19:57:29

没有什么不同,只是编译器会对第一个编译器更满意,因为它知道您并不关心Iterator返回的内容;-)

在第二种情况下,编译器可能会发出警告,因为类型未指定,无法检查。到处都是警告意味着你没有注意到那些真正重要的东西。

票数 3
EN

Stack Overflow用户

发布于 2012-03-05 19:56:16

第一个意思是它迭代的对象可以是任何东西。第二个在实践中是相同的,但在理论上是,您没有泛型,所以您没有使用编译器提供的优势。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9573031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档