850 likes | 1.07k Vues
Новые возможности Java 5. Java Advanced. Версии Java. Java Language Specification First Edition 1996 1.0 – 1.1 Second Edition 2000 1.2 – 1.4 Third Edition 2005 1.5+ Java Virtual Machine Specification First Edition 1996 1.0 – 1.1 Second Edition 1999 1.2+. Часть 1. Generics.
E N D
Новые возможности Java 5 Java Advanced
Версии Java • Java Language Specification • First Edition 1996 1.0 – 1.1 • Second Edition 2000 1.2 – 1.4 • Third Edition 2005 1.5+ • Java Virtual Machine Specification • First Edition 1996 1.0 – 1.1 • Second Edition 1999 1.2+ Java Advanced / Новые возможности Java 5
Часть 1 Generics
Полиморфизм • Один код – разное поведение • Ad-hoc • Перегрузка • Автоматизированное приведение типов • Универсальный • Параметрический • Включения Java Advanced / Новые возможности Java 5
Пример полиморфизма (1) • Операция сложения (+) • Примеры использования • 1 +1 • 1.0 +1 • 1 +1.0 • 1.0+1.0 • Перегрузка времени компиляции по обоим параметрам • Перегрузка для разных типов + автоматизированное приведение типов Java Advanced / Новые возможности Java 5
Пример полиморфизма (2) • Функция printf • Примеры использования • printf("%d", 10); • printf("%s", "hello"); • Перегрузка времени исполнения по всем параметрам, кроме первого + явная передача информации о типах Java Advanced / Новые возможности Java 5
Пример полиморфизма (3) • Наследование в ООП • Пример использования drawWithColor(Shape shape, Color color) { shape.setColor(color); shape.draw() } • drawWithColor – полиморфизм включения по первому параметру • draw(this) – перегрузка времени исполнения по первому параметру Java Advanced / Новые возможности Java 5
Пример полиморфизма (4) • Определение типа во время исполнения • Пример использования void draw(Shape shape) { if (shape instanceof Rect) … if (shape instanceof Circle) … } • draw() – перегрузка времени исполнения Java Advanced / Новые возможности Java 5
Пример полиморфизма (5) • Шаблоны в С++ • Пример использования template <typename T> bool contains(T x, T a[], int size) { for(int i = 0; i < size; i++)if (x == a[i]) return true; return false; } • Перегрузка времени компиляции по всем параметрам Java Advanced / Новые возможности Java 5
Пример полиморфизма (6) • Generics в Java • Пример использования <T> boolean contains(T item, T[] array) { for(int i = 0; i < array.length; i++) if (item.equals(array[i])) return true; return false; } • Параметрический полиморфизм по T Java Advanced / Новые возможности Java 5
Особенности Generics • Строгая типизация • Единая реализация • Отсутствие информации о типе Java Advanced / Новые возможности Java 5
Generic коллекции • Коллекции, множества, списки, … параметризуются типом элемента • Collection<E> • Set<E> • List<E> • … • Отображения параметризуются типами ключа и значения • Map<K, V> • SortedMap<K, V> • … Java Advanced / Новые возможности Java 5
Пример определения generic-класса public interface List<E> extends Collection<E> { E get(int i); set(int i, E e); add(E e); Iterator<E> iterator(); ... } Java Advanced / Новые возможности Java 5
Generic List • List<E>─ список элементов E • Раньше List list = new List(); list.add(new Integer(1)); Integer i = (Integer) list.get(0); • Теперь List<Integer> list = new List<Integer>(); list.add(new Integer(1)); Integer i = list.get(0); Java Advanced / Новые возможности Java 5
Пример. Подсчет количества слов Map<String, Integer> map = new TreeMap<String, Integer>(); for (Iterator<String> i = c.iterator(); i.hasNext(); ) { String word = i.next(); Integer count = map.get(word); int value = (count == null) ? 0 : count.intValue(); map.put(word, new Integer(value + 1)); } Java Advanced / Новые возможности Java 5
Пример реализации 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]; } ... } Java Advanced / Новые возможности Java 5
Несовместимость generic-типов • Generic-типы не совместимы по присваиванию List<Integer> li = new ArrayList<Integer>(); List<Object> lo = li; • Иначе — ошибки lo.add(“hello”); Integer li = lo.get(0); // ClassCastException Java Advanced / Новые возможности Java 5
Проверка типов времени исполнения • Класс Collections • List<S> checkedList(List<S>, S.class) • checkedCollection • checkedMap • … Java Advanced / Новые возможности Java 5
Часть 2 Реализация Generic
Проблема 1 • Метод void dump(Collection<Object> c) { for (Iterator<Object> i = c.iterator(); i.hasNext(); ) { Object o = i.next(); System.out.println(o); } } • Вызовы • List<Object> l; dump(l); • List<Integer> l; dump(l); Java Advanced / Новые возможности Java 5
Решение 1 – wildcard • Метод void dump(Collection<?> c) { for (Iterator<?> i = c.iterator(); i.hasNext(); ) { Object o = i.next(); System.out.println(o); } } • Вызовы • List<Object> l; dump(l); • List<Integer> l; dump(l); Java Advanced / Новые возможности Java 5
Проблема 2 • Метод void draw(List<Shape> c) { for (Iterator<Shape> i = c.iterator(); i.hasNext(); ) { Shape s = i.next(); s.draw(); } } • Вызовы • List<Shape> l; draw(l); • List<Circle> l; draw(l); Java Advanced / Новые возможности Java 5
Решение 2 –bounded wildcard • Метод void draw(List<? extends Shape> c) { for (Iterator<? extends Shape> i = c.iterator(); i.hasNext(); ) { Shape s = i.next(); s.draw(); } } • Вызовы • List<Shape> l; draw(l); • List<Circle> l; draw(l); Java Advanced / Новые возможности Java 5
Проблема 3 • Метод void addAll(Object[] a, Collection<?> c) { for (int i = 0; i < a.length; i++) { c.add(a[i]); } } Java Advanced / Новые возможности Java 5
Решение 3 –generic-метод • Метод <T> void addAll(T[] a, Collection<T> c) { for (int i = 0; i < a.length; i++) { c.add(a[i]); } } • Примеры использования • addAll(new String[10], new ArrayList<String>()); • addAll(new Object[10], new ArrayList<Object>()); • addAll(new String[10], new ArrayList<Object>()); • addAll(new Object[10], new ArrayList<String>()); Java Advanced / Новые возможности Java 5
Проблема 4 • Метод <T> void addAll(Collection<T> c, Collection<T> c2) { for (Iterator<T> i = c.iterator(); i.hasNext(); ) { T o = i.next(); c2.add(o); } } • Примеры использования • addAll(new AL<Integer>(), new AL<Integer>()); • addAll(new AL<Integer>(), new AL<Object>()); Java Advanced / Новые возможности Java 5
Решение 4– bounded type argument • Метод <T, S extends T> void addAll(Collection<S> c, Collection<T> c2) { for (Iterator<S> i = c.iterator(); i.hasNext(); ) { S o = i.next(); c2.add(o); } } • Примеры использования • addAll(new AL<Integer>(), new AL<Integer>()); • addAll(new AL<Integer>(), new AL<Object>()); Java Advanced / Новые возможности Java 5
Решение 4’ – bounded wildcard • Метод <T> void addAll(Collection<? extends T> c, Collection<T> c2) { for (Iterator<? extends T> i = c.iterator(); i.hasNext(); ) { T o = i.next(); c2.add(o); } } • Примеры использования • addAll(new AL<Integer>(), new AL<Integer>()); • addAll(new AL<Integer>(), new AL<Object>()); Java Advanced / Новые возможности Java 5
Проблема 5 • Метод <T extends Comparable<T>> T max(Collection<T> c) { } • Пример использования • List<Integer> il; Integer I = max(il); • class Test implements Comparable<Object> {…} List<Test> tl; Test t = max(tl); Java Advanced / Новые возможности Java 5
Решение 5 – upper bounded wcard • Метод <T extends Comparable<? super T>> max(Collection<T> c) { … } • Пример использования • List<Integer> il; Integer I = max(il); • class Test implements Comparable<Object> {…} List<Test> tl; Test t = max(tl); Java Advanced / Новые возможности Java 5
Ограничения Generic • Невозможно создать массив параметра типа • Collection<T> c; • T[] ta; • new T[10]; • Невозможно создать массив Generic-классов • new ArrayList<List<Integer>>(); • List<?>[] la = new List<?>[10]; • List<Integer>[] la = new List<Integer>[10]; Java Advanced / Новые возможности Java 5
Часть 3 Generics и вариантность
Вариантность • Ковариантность • Согласованность с отношением включения • Контрвариантность • Несогласованность с отношением включения • Инвариантность • Независимость от отношения включения Java Advanced / Новые возможности Java 5
Вариантность функторов (1) • Функтор • interface Functor<R, A> { • R apply(A argument); • } • Совместимость по присваиванию (не Java) • Functor<R1, A1> f1; • Functor<R2, A2> f2 = f1; • Что можно сказать о R1, R2и A1, A2 Java Advanced / Новые возможности Java 5
Вариантность функторов (2) • Ковариантность результата • Контрвариантность аргумента • Приведение типов для функторов Functor<R, A> as(Functor<? extends R, ? super A> f) { return new Functor<R, A> { R apply(A argument) { return f(argument); } } } Java Advanced / Новые возможности Java 5
Правило • Источник • extends • Приемник • super • Источник и приемник • Инвариантный Java Advanced / Новые возможности Java 5
Wildcard Capture (1) void swap(List<?> list, int i, int j) { // ? } Java Advanced / Новые возможности Java 5
Wildcard Capture (2) void swap(List<?> list, int i, int j) { swapImpl(list, i, j); } Java Advanced / Новые возможности Java 5
Wildcard Capture (3) void swap(List<?> list, int i, int j) { swapImpl(list, i, j); } <T> void swapImpl(List<T> list, int i, int j) { T temp = list.get(i); list.set(i, list.get(j)); list.set(j, temp); } Java Advanced / Новые возможности Java 5
Часть 4 Смешение generic и не-generic кода
Generic – одинкласс • Примеры List<String> ls; List<Integer> li; ls.getClass() == li.getClass() // True ls instanceof List // True ls instanceof List<String> Java Advanced / Новые возможности Java 5
Пример кода Collection<Integer> c; Iterator<Integer> i = c.iterator(); Integer max = i.next(); while(i.hasNext()) { Integer next = i.next(); if (next.compareTo(result) > 0) { max = next; } } Java Advanced / Новые возможности Java 5
Код без generic Collection c; Iterator i = c.iterator(); Integer max = (Integer) i.next(); while(i.hasNext()) { Integer next = (Integer) i.next(); if (next.compareTo(result) > 0) { max = next; } } Java Advanced / Новые возможности Java 5
Преобразование типов • Уничтожение информации о типе • List l = new ArrayList<String>(); • Добавление информации о типе • List<String> l = (List<String>) new ArrayList(); • List<String> l1 = new ArrayList(); • Unchecked warning Java Advanced / Новые возможности Java 5
Часть 5 Autoboxing
Примитивные типы и обертки Java Advanced / Новые возможности Java 5
Boxing и Unboxing • Boxing – заключение значения примитивного типа в обертку int a = …; new Integer(a) • Unboxing – извлечение значения примитивного типа из обертки Integer a = …; a.intValue() Java Advanced / Новые возможности Java 5
Autoboxing • Генерация кода для boxing и unboxing при необходимости • Явное приведение типов • (Integer) 10 • (int) new Integer(10) • (Object) 10 • Приведение типов “по ходу” Java Advanced / Новые возможности Java 5
Пример • Исходный код Integer i1 = 1; Integer i2 = 2; Integer i3 = i1 + i2; • Сгенерированный код Integer i1 = Integer.valueOf(1); Integer i2 = Integer.valueOf(2); Integer i3 = Integer.valueOf(i1.intValue() + i2.intValue()); Java Advanced / Новые возможности Java 5
Пример. Подсчет количеств слов Map<String, Integer> map = new TreeMap<String, Integer>(); for (Iterator<String> i = c.iterator(); i.hasNext(); ) { String word = i.next(); Integer count = map.get(word); m.put(word, (count == null) ? 1 : count + 1); } Java Advanced / Новые возможности Java 5