- •JAVA-ТЕХНОЛОГИЯ
- •Нововведения в язык в Java 1.5
- •Перечисления (type-safe enums)
- •Подход к перечислениям в Java
- •Пример 1: перечисления в Java
- •Пояснение к примеру 1 (перечисления в Java)
- •Пример 2: Тип-перечисление с методом
- •Пояснения к примеру 2 (тип-перечисление с методом)
- •Роль конструктора в перечислениях
- •Параметризованные типы (generics)
- •История generics (продолжение)
- •Основы generics в языке Java (JSR 14, 1999 – 2004,
- •Пояснения к примеру 1 (Java generics)
- •Параметризованные методы. Ограничения на типы-параметры
- •Пояснения к примеру 2
История generics (продолжение)
Впервые термин generic (package) был введен в языке Ада (1979), в котором есть возможность описывать параметризованные пакеты (packages) – агрегаты данных и процедур, реализующих операции над ними
В языке C++ введены шаблоны (templates) –
разновидность generics, значительно менее безопасная, чем в CLU / Java / C#, так как контроль ограничений на параметры-типы отсутствует. Реализация шаблонов основана на дублировании кода
В настоящее время generics реализованы практически во всех современных языках и системах программирования,
включая даже Visual Prolog
Сравнение с .NET: возможности generics в Java и C#
аналогичны друг другу. Однако в Java имеет место
(C)“стираниеВ.О. Сафонов. типов” для конкретизаций, а в .NET этот 2013недостаток отсутствует
Основы generics в языке Java (JSR 14, 1999 – 2004,
spec lead – Gilad Bracha, Sun)
Пример 1 (Sun) - фрагмент из пакета java.util:
public interface List<E> { void add(E x); Iterator<E> iterator();
} // List
public interface Iterator<E> { E next();
boolean hasNext(); } // Iterator
Использование:
List <String> ls = new ArrayList<String> ();
ls.add (“new string”);
(C) В.О. Сафонов. 2013
Пояснения к примеру 1 (Java generics)
Первый же пример generics связан с коллекциями (java.util.Collection). Коллекции – это общеупотребительные структуры данных (списки, стеки, таблицы, деревья и др.), агрегированные с операциями над ними.
Определены два параметризованных интерфейса – List (список) и Iterator (итератор – абстракция перебора элементов некоторой
коллекции)
Параметр E – тип элемента списка (коллекции)
Альтернативный способ – описание аналогичных интерфейсов ListInt, ListDouble, … для каждого типа элемента списка
При использовании параметризованный интерфейс (класс) должен быть конкретизирован (instantiated), т.е. для него должен быть указан конкретный фактический параметр-тип
Реализация: никаких текстовых подстановок и т.п. не производится. Определение generic компилируется один раз. Код не дублируется
(C)В.О. Сафонов.
2013
Параметризованные методы. Ограничения на типы-параметры
Пример 2 (Sun) : class ListUtilities {
public static <T implements Comparable<T>> T max(List<T> xs) {
Iterator<T> xi = xs.iterator(); T w = xi.next();
while (xi.hasNext()) { T x = xi.next();
if (w.compareTo(x) < 0) w = x;
}
return w;
(C)}В.О. Сафонов. 2013
Пояснения к примеру 2
Метод max – пример параметризованного
метода с ограничениями на тип-параметр
Ограничение задается в виде:
<T extends SomeClass> или
<T implements SomeInterface>
Компилятор выполняет полный статический контроль корректности конкретизаций типов (в отличие от C++)
Еще одна интересная возможность – wildcards:
void printCollection (Collection<?> c) { … }
Метод применим для печати любой
(C) Вколлекции.О. Сафонов. 2013
Q&A
Вопросы?
(C) В.О. Сафонов. 2013
