Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java1_2013_2014 / java13.pptx
Скачиваний:
172
Добавлен:
16.04.2015
Размер:
126.75 Кб
Скачать

История 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

Соседние файлы в папке java1_2013_2014