2012-02-15 148 views
1

我遇到問題。我想補充並檢索相同類的ArrayList對象,但是當我嘗試找回它們,我得到不兼容的類型erroeJava ArrayList不兼容類型

import java.util.*; 

public class Test{ 

Test(){ 
    main(); 
} 

List test = new ArrayList(); 

public void main(){ 
    test.add(new Square(10)); 

    Iterator i = test.iterator(); 
    while(i.hasNext()){ 
     Square temp = i.next(); 
    } 
} 
} 

回答

6

是 - 你不使用泛型的任何地方,所以i.next();剛剛返回Object至於編譯器而言。

選項:

  • 使用泛型
  • 演員到Square

    Square temp = (Square) i.next(); 
    

個人而言,我會傾向於使用泛型 - 這是更漂亮有型的安全,你可以:)

// Not clear why this is an instance variable - and please make fields private :) 
List<Square> test = new ArrayList<Square>(); 

public void main() { 
    test.add(new Square(10)); 

    Iterator<Square> i = test.iterator(); 
    while(i.hasNext()) { 
     Square temp = i.next(); 
     // Use square here 
    } 
} 

兩個旁白:

  • 增強for迴路可替代while循環:

    for (Square square : test) 
    
  • 很奇怪有一個實例方法稱爲main不帶參數; public static void main(String[] args)更常見。沒有什麼是非法的,你在這裏做了什麼,只是奇怪。

+0

@Downvoter:護理評論? – 2012-02-15 09:51:44

1

您應該使用型List<Square>ArrayList<Square>Iterator<Square>避免這種。

如果您不知道test中元素的實際類型是什麼,並且它認爲它們的類型爲Object

List<Square> test = new ArrayList<Square>(); 
public void main(){ 
    test.add(new Square(10)); 

    Iterator<Square> i = test.iterator(); 
    while(i.hasNext()){ 
     Square temp = i.next(); 
    } 
} 
1

你必須轉換爲Square

while(i.hasNext()){ 
    Square temp = (Square) i.next(); 
} 

的迭代器將只返回Object類型的元素。

使用Java 1.5+和泛型,我們可以不用鑄造:

// a list, that will only accept Square instances 
List<Square> test = new ArrayList<Square>(); 

public void main(){ 
    test.add(new Square(10)); 

    Iterator<Square> i = test.iterator(); 
    while(i.hasNext()){ 
     Square temp = i.next(); 
    } 
} 
+0

親愛的downvoter,請解釋... – 2012-02-15 09:49:40

+0

我不是downvoter,但我認爲downvoter *可能*只看到您的答案的早期版本 - 你只提到鑄造問題,而不是使用泛型替代。 。 – amit 2012-02-15 09:51:42

+0

eErr,no。事實並非如此。無論如何,我認爲泛型暗示是一種獎勵信息 - 一個簡單的演員就完美地解決了這個問題 – 2012-02-15 09:53:20