可能重复:
What is a raw type and why shouldn't we use it?迭代<?> VS迭代器中的Java
的问题是包含在说明相当多的自我:是什么样的区别
Iterator<?>
和
Iterator
java中的对象?它们都在Object类型上迭代了吗?
可能重复:
What is a raw type and why shouldn't we use it?迭代<?> VS迭代器中的Java
的问题是包含在说明相当多的自我:是什么样的区别
Iterator<?>
和
Iterator
java中的对象?它们都在Object类型上迭代了吗?
没有。 Iterator<?>
遍历?
s(某些类型源自Object
),而Iterator
仅提供Object
s。这是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);
}
注意铸造?那是因为我们只是将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;
第一个意思是它迭代的对象,它们可以是任何东西。实际上第二个是相同的,但理论上你没有泛型,所以你没有使用编译器提供的优势。
没有区别,不同之处在于,编译器会更快乐与第一位的,因为那知道你不在乎什么迭代器返回;-)
在编译器可能会给第二种情况警告,因为该类型是未指定的,无法检查。到处都有很多警告意味着你没有注意到那些真正重要的警告。
@ruakh:对不起试图找到类似的问题,不知道如何字呢。感谢您的链接。 – Bober02 2012-03-05 20:00:05
不需要道歉。我能找到这个问题的唯一原因是我已经知道答案是“原始类型”。我将其标记为重复,以指出您在那里的精彩答案,而不是批评您的问题是否重复该问题。 – ruakh 2012-03-05 20:02:55