Java:ArrayList返回Object而不是所需的类型

时间:2010-07-16 22:15:09

标签: java generics 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对象的列表,所以我真的没有看到这里有什么问题。

任何人都可以帮助我吗?

危害

3 个答案:

答案 0 :(得分:11)

Iterator it将仅返回Object。 Iterator<Show>将为您提供Show类型的对象。如果您没有这样声明,则不会仅假设引用来自您的List<Show>

还有一些未经请求的评论:) 一个人应该通常编程到接口,getCollection应该返回List<Show>而不是ArrayList<Show>,除非真的有一些与ArrayList具体相关的事情。

你也可以使用foreach结构而不是迭代器,这通常比可读性等更好。

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

答案 1 :(得分:2)

我认为您需要Iterator<Show> it = getCollection().iterator();中的getSeasonsCount() `

答案 2 :(得分:2)

如果要确保条目是唯一的,为什么不使用Set而不是列表?

另请注意,您可以稍微改写一下,这对我来说更具可读性:

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