
- •Нововведения Java 5.0.
- •Цели занятия
- •Статический импорт
- •Автоупаковка / автораспаковка
- •Автоупаковка / автораспаковка
- •Автоупаковка / автораспаковка
- •Аргументы переменной длины
- •Аргументы переменной длины
- •Особенности переменного
- •Настраиваемые типы (generic)
- •Настраиваемые типы
- •Настраиваемые типы
- •Настраиваемые типы
- •Настраиваемые типы
- •Настраиваемые типы
- •Ограниченные типы
- •Ограниченные типы
- •Ограниченные типы
- •Ограниченные типы
- •Метасимвольный аргумент
- •Метасимвольный аргумент
- •Метасимвольный аргумент
- •Метасимвол с ограничениями
- •Настраиваемые методы
- •Настраиваемые методы
- •Настраиваемые методы
- •Настраиваемые методы
- •Настраиваемые методы
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ряд особенностей
- •Ошибки неоднозначности
- •Улучшенный цикл for(For-each)
- •Работа улучшенного цикла for
- •Обработка многомерных
- •Вывод
- •Перечислимые типы
- •Перечислимые типы
- •Замечания:
- •Метаданные
- •Метаданные
- •Правила сохранения аннотаций
- •Правила сохранения аннотаций
- •Правила сохранения аннотаций
- •Аннотации-маркеры
- •Одночленные аннотации
- •Одночленные аннотации
- •Одночленные аннотации
- •Встроенные аннотации
- •Встроенные аннотации
- •Литература

Ряд особенностей
41• Настраиваемый класс не может расширять
класс Throwable (нельзя создавать настраиваемые классы исключений)
•От настраиваемых типов можно наследовать, есть ряд особенностей
•Нельзя создать экземпляр массива, у которого базовый тип задан с помощью параметра типа
Пример 11
class Generic<T> { T[] vals; // Верно Generic(T[] nums) {
//vals = new T[10]; //Неверно vals = nums; // Верно
} }
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Ряд особенностей
42• Нельзя создать массив из ссылок на объекты
конкретной версии настраиваемого типа
Generic<Integer>[] gens = new Generic<Integer>[10]; //Неверно
Generic<?>[] gens = new Generic<?>[10]; // Верно
•И как же это работает?
•Механизм стирания:
В реальном байт-коде никаких настраиваемых типов в целом-то и нет…
Вся информация о настраиваемых типах удаляется на стадии компиляции
Именно компилятор осуществляет контроль безопасности приведения типов
А внутри после компиляции все те же «обобщенные» классы, явные приведения типов и т.д.
•Возможны ошибки неоднозначности
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Ошибки неоднозначности
43 |
Пример 12 |
|
|
|
class MyGenClass<T, V> { |
|
T ob1; |
|
V ob2; |
|
// Неверно |
|
void set(T o) { |
|
ob1 = o; |
|
} |
|
void set(V o) { |
|
ob2 = o; |
|
} |
|
} |
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Улучшенный цикл for(For-each)
44 • Имеется:
int[] nums = {1, 2, 3, 4, 5}; int sum = 0;
for (int i = 0; i < 5; i++) sum += nums[i];
•Хотелось бы:
int[] nums = {1, 2, 3, 4, 5}; int sum = 0;
for (int x: nums) sum += x;
•Общая форма записи:
for (type iterVar : iterableObj) statement
Где type – тип элемента, iterVar – переменная цикла, iterableObj – объект с элементами, statement – тело цикла
Все права защищены. www.haulmont.ru info@haulmont.com © HAULMONT, 2013

Работа улучшенного цикла for
45• В каждом витке цикла «извлекается» очередной элемент агрегата
•Ссылка на него (для ссылочных типов) или значение (для примитивных) помещается в переменную цикла
•Тип переменной цикла должен допускать присвоение элементов агрегата
•Цикл выполняется до тех пор, пока не будут перебраны все элементы агрегата
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Обработка многомерных
массивов
46 Пример 13
int sum = 0;
int nums[][] = new int[3][5]; for (int i = 0; i < 3; i++)
for (int j = 0; j < 5; j++) nums[i][j] = (i + 1) * (j + 1);
for (int[] x: nums) for (int y: x)
sum += y;
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

|
|
Особенности улучшенного |
|
47 |
|
|
цикла for |
|
• |
По сути это внутренний итератор |
|
|
• |
Переменная цикла доступна только для чтения |
|
|
• |
Порядок обхода в целом не определен |
|
|
• |
Нет доступа к соседним элементам |
|
|
• |
Агрегат обязан реализовывать интерфейс |
|
|
|
java.lang.Iterable<T> |
|
|
• |
Этот интерфейс содержит лишь один элемент |
|
|
|
Iterator<T> iterator() |
|
|
• |
Данный, вроде бы знакомый, интерфейс, тоже |
|
|
|
претерпел некоторые изменения: |
|
|
|
|
boolean hasNext() |
|
|
|
void remove() |
|
|
|
T next() |
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

Вывод
48• Область применения обобщенного цикла for «несколько уже», чем у «необобщенной»
версии
• Зато для этого класса задач (поиск среднего арифметического, поиск минимального или максимального значения в наборе, поиск дублирующих значений и т. д.) синтаксис обобщенного цикла существенно удобнее
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

|
|
Перечислимые типы |
49 |
• |
В простейшей форме перечислимый тип — это список |
|
||
|
|
именованных констант |
|
• |
Перечислимый тип создается с помощью нового ключевого |
|
|
слова enum |
|
• |
Имеется: |
|
|
class Apple { |
|
|
public static final int JONATHAN = 0; |
|
|
public static final int GOLDENDEL = 1; |
|
|
public static final int REDDEL = 2; |
|
|
public static final int WINESAP = 3; |
|
|
public static final int CORTLAND = 4; |
|
|
} |
|
• |
Хотелось бы: |
enum Apple {
Jonathan, GoldenDel, RedDel, Winesap, Cortland
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |

|
|
Перечислимые типы |
50 |
• |
Перечислимый тип Apple. Идентификаторы Jonathan, |
|
||
|
|
GoldenDel и так далее называются константами |
|
|
перечислимого типа |
|
• |
Каждая объявляется неявно общедоступным, |
|
|
статическим членом класса Apple |
|
• |
После того как вы описали перечислимый тип, можете |
|
|
создать переменную этого типа |
|
• |
Но, несмотря на то что перечислимые типы определены |
|
|
как классы, вы не можете создать экземпляр типа enum |
|
|
с помощью операции new |
|
• |
Вместо этого вы объявляете и используете переменную |
|
|
перечислимого типа почти так же, как вы поступаете с |
|
|
переменными одного из базовых типов, таких как int или |
|
|
char |
Apple ap;
ap = Apple.RedDel;
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |