List<? extends Fruit> fruits = new ArrayList<Fruit>();
//Всем тоды add неработаютсошибкойкомпиляции fruits.add(new Object()); fruits.add(new Fruit()); fruits.add(new Apple()); fruits.add(new Citrus()); fruits.add(new Orange());
//Этотмеработаетод |
|
|
Object o = fruits.get(0); |
get |
|
//Остальныеметоды |
get нерабо тают,потомучто |
|
возвращает Object инужноприводитьбъектунужному типу
Fruit f = fruits.get(0); Apple a = fruits.get(0); Citrus c = fruits.get(0); Orange or = fruits.get(0);
Маски
\\Методкомпилируется
public static List<?> getList() {
List<Fruit> fruits = new ArrayList<Fruit>(); fruits.add(new Apple());
return fruits;
}
List<?> wFruits1 = getList(); \\Работает List<Fruit> wFruits2 = getList();\\Ошибка компиляции
List<Apple> wFruits3 = getList();\\Ошибка компиляции
public static void addToList(List<?> fruits) { \\add не работают все
fruits.add(new Fruit()); fruits.add(new Apple()); fruits.add(new Citrus()); fruits.add(new Orange());
Object o = fruits.get(0); \\работает
\\остальные get неработают
Fruit f = fruits.get(0); Citrus c = fruits.get(0); Orange or = fruits.get(0);
}
//всевызовыневызываютошибкикомпиляции
addToList(new ArrayList<Fruit>()); addToList(new ArrayList<Apple>()); addToList(new ArrayList<Citrus>()); addToList(new ArrayList());
Ограничение снизу
Определяет ограничение супертипа:
<? super sub>
Некоторый конкретный тип, параметр которого является суперклассом для sub.
Имеется:
List<Integer> list = new ArrayList<Integer>(); Map<Integer, Comparable<String>> m =
new HashMap<Integer,Comparable<String>>(); // Зачемдварписатьзаоднотоже???
Необходимо:
List<Integer> list = new ArrayList<>(); Map<Integer, Comparable<String>> m =
new HashMap<>();
Вывод типа (type inference) (Java 1.7)
Можно использовать, если компилятор из контекста может понять, какие типы нужны.
<> – «алмазная запись» (diamond notation)
В основном используется при создании объектов в ходе инициализации переменных. При создании объектов нельзя путать отсутствие указания типа (будет обобщенный тип) и оператор алмаз (будет вывод типа). Из-за механизма стирания в параметризованных типах могут возникать непроверяемые компилятором приведения.
Коллекции в Java (Collections)
Коллекции в Java являются контейнерами объектов, которые благодаря полиморфизму может содержать объекты любого класса, производного от Object (который на самом деле и есть любой класс).
Какие бывают Коллекции?
Существуют два главных интерфейса (рисунок 8.3) для всех типов коллекций в Java:
-Collection<E>;
-Map<K,V>.
Рисунок 8.3 – Типы коллекций
Другие Коллекции
- Guava (Google Collections Library) - библиотека добавляет несколько полезных реализаций структур данных, таких как мультимножество, мультиотображение и двунаправленное отображение. Улучшена эффективность.
-Trove library - реализация коллекций, позволяющая хранить примитивы (в Java Collections Framework примитивы хранить нельзя, только оберточные типы), что позволяет повысить эффективность работы.
-PCJ (Primitive Collections for Java) - так же, как и Trove
предназначены для примитивных типов, что позволит повысить эффективность.
- Наконец Вы сами можете написать собственную коллекцию (тот же связной список). Но данный подход не рекомендуется.
Рекомендуется для начала необходимо освоить базовые коллекции Java которыми пользуются чаще всего. А также некоторые сторонние библиотеки реализуют интерфейсы Java Collections Framework (пример Guava http://guava- libraries.googlecode.com/svn/tags/release05/javadoc/overview-tree.html). То есть знание иерархии классов базовых коллекций позволит более быстро освоить сторонние библиотеки.
Базовые интерфейсы
В библиотеке коллекций Java существует два базовых интерфейса, реализации которых и представляют совокупность всех классов коллекций:
-Collection - коллекция содержит набор объектов (элементов);
-Map - описывает коллекцию, состоящую из пар "ключ —
значение".
Хоть фреймворк называется Java Collections Framework, но интерфейс map и его реализации входят в фреймворк тоже. Интерфейсы Collection и Map являются базовыми, но они не есть единственными. Их расширяют другие интерфейсы, добавляющие дополнительный функционал.
Collection - коллекция содержит набор объектов (элементов). Здесь определены основные методы для манипуляции с данными, такие как вставка (add, addAll), удаление (remove, removeAll, clear), поиск (contains).
Map - описывает коллекцию, состоящую из пар "ключ — значение". У каждого ключа только одно значение, что соответствует математическому понятию однозначной функции или отображения (тар). Такую коллекцию часто называют еще словарем (dictionary) или ассоциативным массивом (associative array). Никак НЕ относится к интерфейсу Collection и является самостоятельным.
Интерфейс Collection расширяют три интерфейса:
-List;
-Set;
-Queue.
Рассмотрим, зачем нужен каждый:
List - Представляет собой неупорядоченную коллекцию, в которой допустимы дублирующие значения. Иногда их называют последовательностями (sequence). Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно обратиться по индексу.
Set - описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Это соответствует математическому понятию множества (set).
Queue - очередь. Это коллекция, предназначенная для хранения элементов в порядке, нужном для их обработки. В дополнение к базовым операциям интерфейса Collection, очередь предоставляет дополнительные операции вставки, получения и контроля.
Java.util.LinkedList
Используется, если вы хотите пройти по списку и посмотреть / изменить элементы в списке, вы используете объект итератора для этого списка (так же, как с другими коллекциями, которые реализуют Iterable интерфейс; все они имеют метод iterator (), который возвращает итератор).