2012-03-05 50 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

沒有區別,不同之處在於,編譯器會更快樂與第一位的,因爲那知道你不在乎什麼迭代器返回;-)

在編譯器可能會給第二種情況警告,因爲該類型是未指定的,無法檢查。到處都有很多警告意味着你沒有注意到那些真正重要的警告。