这是一个可能的重复问题:
什么是原始类型,为什么不应该使用它?
问题在描述中已经很明确了:两者之间有什么区别?
Iterator<?>
并且
Iterator
Java中的对象?它们都遍历Object类型,对吗?
Iterator<?>
并且
Iterator
Java中的对象?它们都遍历Object类型,对吗?
不是这样的。 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
,情况还不错,但想象一下包含另一个包含另一个包含...的映射,你将会进入强制类型转换地狱,很快就无法确定你是在查看从 String
到 Integer
的映射还是反向映射 Integer
到 String
的其他映射。
在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;
除了编译器知道你不关心迭代器返回值之外,两者没有区别。因此,编译器更喜欢第一种情况。
在第二种情况下,由于类型未指定且无法检查,编译器可能会发出警告。到处都有大量警告意味着你不会注意到实际上很重要的那些警告。
第一个意味着它迭代的对象可以是任何东西。第二个在实践中是相同的,但在理论上是你没有使用泛型,因此你没有使用编译器提供的优势。