Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прога.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
345 Кб
Скачать
☆

Коллекции — это наборы произвольных объектов

Общим свойством коллекций является то, что они работают с Object (базовый класс для всех классов Java). Это означает, что мы можем добавлять в коллекцию любые объекты Java, т.к. Object является базовым классом для всех классов Java. При извлечении из коллекции мы тоже получаем Object. Зачастую это приводит к необходимости преобразования полученного из коллекции объекта к нужному классу (downcasting).

Это очень удобно для реализации самих коллекций, но не всегда хорошо при программировании. Если мы составляем коллекцию из объектов класса A и в результате ошибки поместим туда объект класса B, то при выполнении программы мы получим ClassCastException при попытке преобразования извлеченного из коллекции элемента к классу A (а потом будем долго искать, где же ошибка).

Идеальный вариант это, во-первых, получить сообщение об ошибке в точке ее возникновения, а не в точке ее проявления, а, во-вторых, во время трансляции программы, а не при ее выполнении.

Поэтому во многих случаях лучше построить на основе класса поддержки коллекции свой класс, который обеспечит нужный контроль типов во время трансляции. Например, пусть нам нужен список объектов класса MyType и мы решили использовать для его построения стандартный класс ArrayList (см. документацию). Тогда можно создать вспомогательный класс MyList такого вида:

public class MyList {

private ArrayList v = new ArrayList();

public void add(MyType obj) {

v.add(obj);

}

public MyType get(int index) {

return (MyType)v.get(index);

}

public int size() {

return v.size();

}

}

Класс MyList хорош тем, что в такой список нельзя добавить ничего, кроме объектов типа MyType, а извлеченные из списка объекты сразу приводятся к типу MyType внутри метода get().

Отступление . Этот пример интересен еще одним. Он демонстрирует случай, когда вместо наследования следует применять агрегацию. Действительно, если бы мы наследовали от ArrayList, то остались бы доступными методы ArrayList, оперирующие с Object, а не с MyType и мы бы не получили желаемого эффекта.