2012-03-05 47 views
2

可能重复:
What is a raw type and why shouldn't we use it?迭代<?> VS迭代器中的Java

的问题是包含在说明相当多的自我:是什么样的区别

Iterator<?> 

Iterator 

java中的对象?它们都在Object类型上迭代了吗?

+0

@ruakh:对不起试图找到类似的问题,不知道如何字呢。感谢您的链接。 – Bober02 2012-03-05 20:00:05

+3

不需要道歉。我能找到这个问题的唯一原因是我已经知道答案是“原始类型”。我将其标记为重复,以指出您在那里的精彩答案,而不是批评您的问题是否重复该问题。 – ruakh 2012-03-05 20:02:55

回答

4

没有。 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相比,效果并不差,但想象一张包含地图的地图,其中包含一张包含地图的地图......嗯,您明白了。你正在投入地狱,你很快就不知道你是否正在查看从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; 
1

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

3

没有区别,不同之处在于,编译器会更快乐与第一位的,因为那知道你不在乎什么迭代器返回;-)

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