Iterator <?> vs java中的Iterator

Bob*_*r02 4 java generics iterator

可能重复:
什么是原始类型,为什么我们不应该使用它?

这个问题几乎完全包含在描述中:有什么区别

Iterator<?>
Run Code Online (Sandbox Code Playgroud)

Iterator
Run Code Online (Sandbox Code Playgroud)

java中的对象?他们都在对象类型上进行迭代吗?

Edw*_*son 9

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

什么是?类型?嗯,这是一个很好的问题.

回到Java 5之前的旧时代,你有无类型的集合和无类型的迭代器.所以你Object的收藏品中有s,你必须手动投射它们.例如:

List foo = new ArrayList();
foo.add("Foo!");

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

    System.out.println((String)element);
}
Run Code Online (Sandbox Code Playgroud)

注意演员?那是因为我们只是Object填入列表,我们必须自己做所有的内务处理.仅仅是a并没有那么糟糕List,但想象一下包含地图的地图,地图中包含一个......好吧,你明白了.你在铸造地狱,你可以很快知道是不是你正在寻找一个地图,从去StringInteger或你的另一从会倒流地图IntegerString.

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

List<String> foo = new ArrayList();
foo.add("Foo!");

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

    System.out.println(element);
}
Run Code Online (Sandbox Code Playgroud)

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

当您开始使用更复杂的数据结构时,这非常有用,例如:

Map<String, Map<String, Map<String, SomeRandomObject>>> complexMap;
Run Code Online (Sandbox Code Playgroud)