Java中的Iterator<?>和Iterator有什么区别?

4

@ruakh:抱歉,我在尝试寻找类似的问题,但不知道该如何表达。感谢提供链接。 - Bober02
3
不需要道歉。我之所以能找到那个问题,是因为我已经知道了答案是“原始类型”。我标记它为重复,是为了让你看到那里的精彩答案,而不是批评你的问题重复了那个问题。 - ruakh
3个回答

11

不是这样的。 Iterator<?> 迭代的是 ? 类型(某些派生自 Object 的类型),而 Iterator 仅提供 Object。这是 Java 中的泛型支持。

什么是 ? 类型?那是个好问题。

在 Java 5 之前的坏日子里,你有未经类型化的集合和未经类型化的迭代器。因此,你的集合中会有 Object,你必须手动进行强制转换。例如:

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中,您可以使用泛型,现在可以这样说:

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> 并获得一些类型安全性。
当您开始处理更复杂的数据结构时,例如:
Map<String, Map<String, Map<String, SomeRandomObject>>> complexMap;

3

除了编译器知道你不关心迭代器返回值之外,两者没有区别。因此,编译器更喜欢第一种情况。

在第二种情况下,由于类型未指定且无法检查,编译器可能会发出警告。到处都有大量警告意味着你不会注意到实际上很重要的那些警告。


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接