2015-03-12 2 views
1

Я реализую интерфейс, содержащий ArrayList объектов Station. Он использует следующий код, чтобы вернуть ArrayList в виде коллекции типов.Доступ к ArrayList возвращен как тип Collection <Object>

public class NetworkImpl implements Network { 

    private Collection<Station> stationList = new ArrayList<Station>(); 

    public Collection<Station> getStations() { 
     return stationList; 
    } 
} 

После того как я заселили stationList ArrayList, я не могу получить доступ к отдельным станциям непосредственно, как бы я идти об этом? Я попытался следующие, но это не работает:

public class Test { 

public static void main(String args[]) { 
    Network newNetwork = new NetworkImpl(); // This is implemented and populated elsewhere 
    newNetwork.getStations().get(0); 
    } 
} 

ответ

6

Если вам требуется произвольный доступ к элементам коллекции, getStations() должен возвращать List<Station> и не Collection<Station>.

Конечно, вы можете бросить возвращаемый Collection к List или ArrayList (после использования instanceof проверить его тип), но если метод возвращает Collection, нет никакой гарантии, что его реализация не изменит один день, чтобы возвращать Set, что нарушит ваш код, основанный на случайном доступе.

Другой вариант заключается в построении ArrayList на основе вернулся Collection - new ArrayList<Station>(newNetwork.getStations()), который будет гарантировать, что вы в конечном итоге с ArrayList, независимо от того, какой тип Collection возвращается методом.

+0

К сожалению, это школьное задание, я не могу изменить класс, который они нам дали реализовать. – user3371750

+2

@ user3371750 Вам не нужно менять код интерфейса. Найдите «ковариантный тип возврата». –

+0

@ Eng.Fouad См. Мой ответ, это то, что вы имели в виду? –

1

Вы должны, вероятно, iterate над коллекцией, используя Iterator.

Или, как это было предложено @ Eng.Fouad, так как Java 5 вы можете задать более узкий тип возвращаемого в вашей реализации:

public class NetworkImpl implements Network { 

    private List<Station> stations = new ArrayList<Station>(); 

    // covariant return type: narrower than Collection<List>  
    public List<Station> getStations() { 
     return stations ; 
    } 
} 
-2

Вы можете бросить коллекции в список в этом случае

((List<Station>)newNetwork.getStations()).get(0); 
+2

Это плохой дизайн, он сочетает код с реализацией NetworkImpl. –

0

Посмотрите на интерфейс Collection.

Два метода явно предназначены для доступа к элементам в коллекции. Есть iterator(), который позволит вам пройти через все элементы в коллекции в некоторой последовательности, и есть toArray(), который позволит вам получить доступ к элементам по индексу.

Смежные вопросы