2010-07-16 83 views
0

我有一個我以前遇到的問題,但我仍然不知道它爲什麼會發生。 這是代碼:Java:ArrayList返回對象,而不是所需的類型

package Program; 

import java.util.ArrayList; 
import java.util.Iterator; 

/** 
* This class will hold the full collection of the user. 
* 
* @author Harm De Weirdt 
*/ 
public class ShowManager { 

    /** 
    * The collection of shows of this user. 
    */ 
    private ArrayList<Show> collection; 

    private static final ShowManager INSTANCE = new ShowManager(); 

    // Private constructor prevents instantiation from other classes 
    private ShowManager() { 
     collection = new ArrayList<Show>(); 
    } 

    public static ShowManager getInstance() { 
     return INSTANCE; 
    } 

    private ArrayList<Show> getCollection() { 
     return collection; 
    } 

    /** 
    * Add a new Show to the collection 
    * 
    * @param newShow 
    *  The show to be added 
    * @post if <newShow> was not null and the collection didn't already contain 
    *  <newShow>, <newShow> was added to the collection 
    *  |getCollection().contains(<newShow>) 
    */ 
    public void addShow(Show newShow){ 
     if(newShow != null && !getCollection().contains(newShow)){ 
      getCollection().add(newShow); 
     } 
    } 

    /** 
    * Gives the amount of shows this user has in his collection. 
    * 
    * @return the size of <collection>. 
    */ 
    public int getShowCount(){ 
     return getCollection().size(); 
    } 

    public int getSeasonsCount(){ 
     Iterator it = getCollection().iterator(); 
     int amount = 0; 
     while(it.hasNext()){ 
      amount += it.next().getSeasonCount(); 
     } 
     return amount; 
    } 
} 

的問題是與getSeasonsCount方法。 it.next()返回一個Object而不是一個Show對象。 據我所知,這是一個泛型的問題,但我指定收集ArrayList是一個Show對象的列表,所以我真的不明白這裏有什麼問題。

任何人都可以幫助我嗎?

危害

回答

11

Iterator it將返回唯一對象。 Iterator<Show>會給你Show類型的對象。如果你不聲明這樣的說法,它不會只是假設基準從List<Show>

也來了一些不請自來的評論:) 每個人都應該正常程序接口,getCollection或許應該回到List<Show>,而不是除非真的有關於它的具體事實是ArrayList

您還可以使用foreach構造,而不是迭代器,這是通常優選可讀性等

for (Show show : getCollection()) { 
    amount += show.getSeasonCount(); 
} 
+1

教訓:不要忽略編譯器警告「的Iterator是一個原始類型...」; - ) – 2010-07-16 22:22:33

+0

爲什麼最好讓getCollection返回一個List 而不是ArrayList?我真的不明白這與接口有什麼關係..(我仍在學習Java,並且我不得不麻煩了解接口的使用和功能) – 2010-07-16 22:35:11

+2

假設有一天你得到一個要求,你的類必須是線程安全的,以便多個用戶可以訪問同一個用戶。您可能想要將ArrayList更改爲Vector。如果你將它聲明爲List,你所要做的就是將它在構造函數中初始化的地方進行更改,並且它在任何地方都是固定的。如果您將它作爲ArrayList的實例傳遞,則必須在整個應用程序中的任何位置進行更改。 – Affe 2010-07-16 22:41:17

2

我認爲你需要Iterator<Show> it = getCollection().iterator();getSeasonsCount() `

2

爲什麼不使用,而不是設置列表如果你想確保條目是唯一的?

另外請注意,你可以在一個稍微不同的方式改寫這一點,這對我來說是更具可讀性:

public int getSeasonsCount(){ 
    int amount = 0; 
    for (Show show : getCollection()) { 
     amount += show.getSeasonCount(); 
    } 
    return amount; 
} 
+0

我會考慮使用一個Set來代替,不知道它是否存在:) – 2010-07-16 22:33:30

+0

它也比int int的標準有更差的性能循環 – Woot4Moo 2010-07-16 22:33:44

+0

你的意思是說整個it.hasNext()的性能差,那麼當我想寫for(int i = 0,i 2010-07-16 22:39:30

相關問題