Java: ArrayList возвращает объект вместо желаемого типа - PullRequest
0 голосов
/ 17 июля 2010

У меня есть проблема, с которой я сталкивался раньше, но я до сих пор не знаю, почему это происходит. Это код:

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 () возвращает объект вместо объекта Show. Насколько я знаю, это вопрос обобщений, но я указал, что коллекция ArrayList представляет собой список объектов Show, поэтому я действительно не вижу, что здесь не так.

Кто-нибудь может мне помочь?

Вред

Ответы [ 3 ]

11 голосов
/ 17 июля 2010

Iterator it вернет только Объект. Iterator<Show> даст вам объекты типа Show. Если вы не заявите об этом таким образом, не будет только предполагаться, что ссылка пришла от вашего List<Show>

Также для некоторых нежелательных комментариев :) Обычно нужно программировать на интерфейсы, getCollection, вероятно, должен возвращать List<Show>, а не ArrayList<Show>, если только в действительности нет чего-то значимого в том, что это ArrayList конкретно.

Вы также можете использовать конструкцию foreach, а не итератор, что обычно предпочтительнее для удобства чтения и т. Д.

for (Show show : getCollection()) {
   amount += show.getSeasonCount();
}
2 голосов
/ 17 июля 2010

Почему бы не использовать Set вместо списка, если вы хотите, чтобы записи были уникальными?

Также обратите внимание, что вы можете переписать это немного по-другому, что для меня более читабельно:

public int getSeasonsCount(){
    int amount = 0;
    for (Show show : getCollection()) {
        amount += show.getSeasonCount();
    }
    return amount;
}
2 голосов
/ 17 июля 2010

Я думаю, вам нужно Iterator<Show> it = getCollection().iterator(); в getSeasonsCount() `

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...