generic public interface ListE extends CollectionE E getint
Пример определения generic-класса public interface List<E> extends Collection<E> { E get(int i); set(int i, E e); add(E e); Iterator<E> iterator(); . . . } Georgiy Korneev Java Advanced / Новые возможности Java 5 6
Generic List<E> ─ список элементов E l Раньше l List list = new List(); list. add(new Integer(1)); Integer i = (Integer) list. get(0); l Теперь List<Integer> list = new List<Integer>(); list. add(new Integer(1)); Integer i = list. get(0); Georgiy Korneev Java Advanced / Новые возможности Java 5 7
Пример. Подсчет количества слов Map<String, Integer> map = new Tree. Map<String, Integer>(); for (Iterator<String> i = c. iterator(); i. has. Next(); ) { String word = i. next(); Integer count = map. get(word); int value = (count == null) ? 0 : count. int. Value(); map. put(word, new Integer(value + 1)); } Georgiy Korneev Java Advanced / Новые возможности Java 5 8
Пример реализации generic-класса public class AL<E> implements List<E> { private E[] elements; public AL() { elements = (E[]) new Object[10]; } public E get(int i) { return elements[i]; }. . . } Georgiy Korneev Java Advanced / Новые возможности Java 5 9
Несовместимость generic-типов Generic-типы не совместимы по присваиванию List<Integer> li = new Array. List<Integer>(); List<Object> lo = li; l Иначе — ошибки lo. add(“hello”); Integer li = lo. get(0); // Class. Cast. Exception l Georgiy Korneev Java Advanced / Новые возможности Java 5 10
Проверка типов времени исполнения l Класс Collections List<S> checked. List(List<S>, S. class) l checked. Collection l checked. Map l … l Georgiy Korneev Java Advanced / Новые возможности Java 5 11
Проблема 1 l Метод void dump(Collection<Object> c) { for (Iterator<Object> i = c. iterator(); i. has. Next(); ) { Object o = i. next(); System. out. println(o); } } l Вызовы List<Object> l; dump(l); l List<Integer> l; dump(l); l Georgiy Korneev Java Advanced / Новые возможности Java 5 13
Решение 1 – wildcard l Метод void dump(Collection<? > c) { for (Iterator<? > i = c. iterator(); i. has. Next(); ) { Object o = i. next(); System. out. println(o); } } l Вызовы List<Object> l; dump(l); l List<Integer> l; dump(l); l Georgiy Korneev Java Advanced / Новые возможности Java 5 14
Проблема 2 l Метод void draw(List<Shape> c) { for (Iterator<Shape> i = c. iterator(); i. has. Next(); ) { Shape s = i. next(); s. draw(); } } l Вызовы List<Shape> l; draw(l); l List<Circle> l; draw(l); l Georgiy Korneev Java Advanced / Новые возможности Java 5 15
Решение 2 – bounded wildcard l Метод void draw(List<? extends Shape> c) { for (Iterator<? extends Shape> i = c. iterator(); i. has. Next(); ) { Shape s = i. next(); s. draw(); } } l Вызовы List<Shape> l; draw(l); l List<Circle> l; draw(l); l Georgiy Korneev Java Advanced / Новые возможности Java 5 16
Проблема 3 l Метод void add. All(Object[] a, Collection<? > c) { for (int i = 0; i < a. length; i++) { c. add(a[i]); } } Georgiy Korneev Java Advanced / Новые возможности Java 5 17
Решение 3 – generic-метод l Метод <T> void add. All(T[] a, Collection<T> c) { for (int i = 0; i < a. length; i++) { c. add(a[i]); } } l Примеры использования add. All(new String[10], new Array. List<String>()); l add. All(new Object[10], new Array. List<Object>()); l add. All(new String[10], new Array. List<Object>()); l add. All(new Object[10], new Array. List<String>()); l Georgiy Korneev Java Advanced / Новые возможности Java 5 18
Проблема 4 l Метод <T> void add. All(Collection<T> c, Collection<T> c 2) { for (Iterator<T> i = c. iterator(); i. has. Next(); ) { T o = i. next(); c 2. add(o); } } l Примеры использования add. All(new AL<Integer>(), new AL<Integer>()); l add. All(new AL<Integer>(), new AL<Object>()); l Georgiy Korneev Java Advanced / Новые возможности Java 5 19
Решение 4 – bounded type argument l Метод <T, S extends T> void add. All(Collection<S> c, Collection<T> c 2) { for (Iterator<S> i = c. iterator(); i. has. Next(); ) { S o = i. next(); c 2. add(o); } } l Примеры использования add. All(new AL<Integer>(), new AL<Integer>()); l add. All(new AL<Integer>(), new AL<Object>()); l Georgiy Korneev Java Advanced / Новые возможности Java 5 20
Решение 4’ – bounded wildcard l Метод <T> void add. All(Collection<? extends T> c, Collection<T> c 2) { for (Iterator<T> i = c. iterator(); i. has. Next(); ) { T o = i. next(); c 2. add(o); } } l Примеры использования add. All(new AL<Integer>(), new AL<Integer>()); l add. All(new AL<Integer>(), new AL<Object>()); l Georgiy Korneev Java Advanced / Новые возможности Java 5 21
Проблема 5 Метод <T extends Comparable<T>> T max(Collection<T> c) { … } l Пример использования l l List<Integer> il; Integer I = max(il); l class Test implements Comparable<Object> {…} List<Test> tl; Test t = max(tl); Georgiy Korneev Java Advanced / Новые возможности Java 5 22
Решение 5 – upper bounded wcard Метод <T extends Comparable<? super T>> max(Collection<T> c) { … } l Пример использования l l List<Intger> il; Integer I = max(il); l class Test implements Comparable<Object> {…} List<Test> tl; Test t = max(tl); Georgiy Korneev Java Advanced / Новые возможности Java 5 23
Ограничения Generic l Невозможно создать массив параметра типа Collection<T> c; l T[] ta; l new T[10]; l l Невозможно создать массив Genericклассов new Array. List<Integer>>(); l List<? >[] la = new List<? >[10]; l List<Integer>[] la = new List<Integer>[10]; l Georgiy Korneev Java Advanced / Новые возможности Java 5 24
Generic – один класс l Примеры List<String> ls; List<Integer> li; ls. get. Class() == li. get. Class() // True ls instanceof List<String> Georgiy Korneev Java Advanced / Новые возможности Java 5 26
Пример кода Collection<Integer> c; Iterator<Integer> i = c. iterator(); Integer max = i. next(); while(i. has. Next()) { Integer next = i. next(); if (next. compare. To(result) > 0) { max = next; } } Georgiy Korneev Java Advanced / Новые возможности Java 5 27
Код без generic Collection c; Iterator i = c. iterator(); Integer max = (Integer) i. next(); while(i. has. Next()) { Integer next = (Integer) i. next(); if (next. compare. To(result) > 0) { max = next; } } Georgiy Korneev Java Advanced / Новые возможности Java 5 28
Преобразование типов l Уничтожение информации о типе l l List l = new Array. List<String>(); Добавление информации о типе List<String> l = (List<String>) new Array. List(); l List<String> l 1 = new Array. List(); l l Unchecked warning Georgiy Korneev Java Advanced / Новые возможности Java 5 29
Часть 4 Autoboxing
Примитивные типы и обертки Примитивный тип Тип-обертка boolean Boolean byte Byte short Short char Character int Integer long Long float Float double Double void Void Georgiy Korneev Java Advanced / Новые возможности Java 5 31
Пример l Исходный код Integer i 1 = 1; Integer i 2 = 2; Integer i 3 = i 1 + i 2; l Сгенерированный код Integer i 1 = Integer. value. Of(1); Integer i 2 = Integer. value. Of(2); Integer i 3 = Integer. value. Of(i 1. int. Value() + i 2. int. Value()); Georgiy Korneev Java Advanced / Новые возможности Java 5 34
Пример. Подсчет количеств слов Map<String, Integer> map = new Tree. Map<String, Integer>(); for (Iterator<String> i = c. iterator(); i. has. Next(); ) { String word = i. next(); Integer count = map. get(word); m. put(word, (count == null) ? 1 : count + 1); } Georgiy Korneev Java Advanced / Новые возможности Java 5 35
Пример. Сумма чисел в коллекции (1) l Старый вариант (проверка на null) int sum = 0; for (Iterator<Integer> i = c. iterator(); i. has. Next(); ) { Integer j = i. next(); if (j != null) { sum += j; } } Georgiy Korneev Java Advanced / Новые возможности Java 5 38
Пример. Сумма чисел в коллекции (3) l Старый вариант int sum = 0; for (Iterator<Integer> i = c. iterator(); i. has. Next(); ) { sum += i. next(); } l Новый вариант int sum = 0; for (int j : c) { sum += j; } Georgiy Korneev Java Advanced / Новые возможности Java 5 40
Пример. Минимум в массиве l Старый вариант int min = Integer. MAX_VALUE; for (int i = 0; i < a. length; i++) { if (min > a[i]) min = a[i]; } l Новый вариант int min = Integer. MAX_VALUE; for (int i : a) { if (min > i) min = i; } Georgiy Korneev Java Advanced / Новые возможности Java 5 41
Пример. Подсчет количеств слов Map<String, Integer> map = new Tree. Map<String, Integer>(); for (String word : c) { Integer count = map. get(word); m. put(word, (count == null) ? 1 : count + 1); } Georgiy Korneev Java Advanced / Новые возможности Java 5 42
Часть 6 Varargs и format
Методы. format Позволяют форматировать строки аналогично функции printf l Классы l Formatter l String l Print. Writer l l Пример String. format("(%d, %d)--(%d, %. 3 f)", 1, 1, 2, 0. 5) l System. out. format(“Hello %s ", user. Name) l Georgiy Korneev Java Advanced / Новые возможности Java 5 46
Пример. Нахождение минимума l Пример метода public static int min(int. . . a) { int min = Integer. MAX_VALUE; for (int i : a) { if (min > i) min = i; } return min; } l Примеры использования l l l min(3) min(1, 2, 3, -1, -2, -3) min(new int[]{1, 2, 3, -1, -2, -3}) Georgiy Korneev Java Advanced / Новые возможности Java 5 48
Интерфейс Formattable Аналог метода to. String() для класса Formattable (%s) l Определение интерфейса l interface Formattable { void format. To( Formatter formatter, int flags, int width, int precision ) } Georgiy Korneev // куда выводить // как выводить // мин. ширина поля // макс. ширина поля Java Advanced / Новые возможности Java 5 49
Часть 7 Static Import
Импортирование статических членов l Импортирование поля import static java. lang. Math. PI; … angle = PI / 2 l Импортирования метода import static java. lang. Math. cos; … cos(angle) Georgiy Korneev Java Advanced / Новые возможности Java 5 51
Как было раньше l Пример public final static int NEW = 1; public final static int RUNNING = 2; public final static int BLOCKED = 3; public final static int FINISHED = 4; l Проблемы Нет проверки типов l Нет проверки уникальности l Плохая расширяемость l Малая информативность l Georgiy Korneev Java Advanced / Новые возможности Java 5 54
Пример. Меры длины (1) public enum Unit { KILOMETER(1 e 3), METER(1), MILLIMETER(1 e-3); private final double length; private Unit(double length) { this. length = length; } public double get. Length() { return length; } } Georgiy Korneev Java Advanced / Новые возможности Java 5 58
Пример. Операции (1) public enum Operation { PLUS { double eval(double x, double y) { return x + y; } }, MINUS { double eval(double x, double y) { return x - y; } }, TIMES { double eval(double x, double y) { return x * y; } }, DIVIDE { double eval(double x, double y) { return x / y; } }; abstract double eval(double x, double y); } Georgiy Korneev Java Advanced / Новые возможности Java 5 59
Пример. Операции (2) double apply(Operation op, double x, double y) { return op. eval(x, y); } Georgiy Korneev Java Advanced / Новые возможности Java 5 60
Пример. Меры длины (2) l Вывод соотношений мер длины for (Unit u 1 : Unit. values()) { for (Unit u 2 : Unit. values()) { System. out. println(String. format( "There are %f %s. S in one %s", u 2. get. Length()/u 1. get. Length(), u 1, u 2 )); } } Georgiy Korneev Java Advanced / Новые возможности Java 5 62
Класс Enum. Set Множество экземпляров перечисления l Храниться побитно l Создание Enum. Set l l l l Enum. Set<T> Enum. Set. none. Of(T. class) Enum. Set<T> Enum. Set. all. Of(T. class) Enum. Set<T> Enum. Set. of(e 1, e 2, …) Enum. Set<T> Enum. Set. copy. Of(Enum. Set<T> s) Enum. Set<T> Enum. Set. copy. Of(Collection<T> t) Enum. Set<T> Enum. Set. complement. Of(Enum. Set<T> s) Georgiy Korneev Java Advanced / Новые возможности Java 5 63
Класс Enum. Map Отображение из перечисления l Храниться в массиве l Создание Enum. Map l Enum. Map<K, V>(K. class) l Enum. Map<K, V>(Enum. Map<K, V>) l Enum. Map<K, V>(Map<K, V>) l Georgiy Korneev Java Advanced / Новые возможности Java 5 64
Ссылки (1) Generics Tutorial // http: //java. sun. com/j 2 se/1. 5/pdf/genericstutorial. pdf l JSR 14 (Generics) // http: //jcp. org/en/jsr/detail? id=14 l Autoboxing // http: //java. sun. com/j 2 se/1. 5. 0/docs/guide/la nguage/autoboxing. html l JSR 201 (Autoboxing) // http: //jcp. org/en/jsr/detail? id=201 l Georgiy Korneev Java Advanced / Новые возможности Java 5 66
Ссылки (2) New Java Language Fatures // http: //java. sun. com/j 2 se/1. 5. 0/docs/relnotes/f eatures. html#lang l Enums (JLS) // http: //java. sun. com/docs/books/jls/third_editio n/html/classes. html#8. 9 l Import Declarations (JLS) // http: //java. sun. com/docs/books/jls/third_editio n/html/packages. html#7. 5 l Georgiy Korneev Java Advanced / Новые возможности Java 5 67
Ссылки (3) l Interfaces (JLS) // http: //java. sun. com/docs/books/jls/third_editio n/html/interfaces. html Georgiy Korneev Java Advanced / Новые возможности Java 5 68
Вопросы Georgiy Korneev Java Advanced / Новые возможности Java 5 69
- Slides: 69