1 / 84

Новые возможности Java 5

Новые возможности 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.

odina
Télécharger la présentation

Новые возможности Java 5

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Новые возможности Java 5 Java Advanced

  2. Версии 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

  3. Часть 1 Generics

  4. Полиморфизм • Один код – разное поведение • Ad-hoc • Перегрузка • Автоматизированное приведение типов • Универсальный • Параметрический • Включения Java Advanced / Новые возможности Java 5

  5. Пример полиморфизма (1) • Операция сложения (+) • Примеры использования • 1 +1 • 1.0 +1 • 1 +1.0 • 1.0+1.0 • Перегрузка времени компиляции по обоим параметрам • Перегрузка для разных типов + автоматизированное приведение типов Java Advanced / Новые возможности Java 5

  6. Пример полиморфизма (2) • Функция printf • Примеры использования • printf("%d", 10); • printf("%s", "hello"); • Перегрузка времени исполнения по всем параметрам, кроме первого + явная передача информации о типах Java Advanced / Новые возможности Java 5

  7. Пример полиморфизма (3) • Наследование в ООП • Пример использования drawWithColor(Shape shape, Color color) { shape.setColor(color); shape.draw() } • drawWithColor – полиморфизм включения по первому параметру • draw(this) – перегрузка времени исполнения по первому параметру Java Advanced / Новые возможности Java 5

  8. Пример полиморфизма (4) • Определение типа во время исполнения • Пример использования void draw(Shape shape) { if (shape instanceof Rect) … if (shape instanceof Circle) … } • draw() – перегрузка времени исполнения Java Advanced / Новые возможности Java 5

  9. Пример полиморфизма (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

  10. Пример полиморфизма (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

  11. Особенности Generics • Строгая типизация • Единая реализация • Отсутствие информации о типе Java Advanced / Новые возможности Java 5

  12. Generic коллекции • Коллекции, множества, списки, … параметризуются типом элемента • Collection<E> • Set<E> • List<E> • … • Отображения параметризуются типами ключа и значения • Map<K, V> • SortedMap<K, V> • … Java Advanced / Новые возможности Java 5

  13. Пример определения 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

  14. 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

  15. Пример. Подсчет количества слов 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

  16. Пример реализации 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

  17. Несовместимость 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

  18. Проверка типов времени исполнения • Класс Collections • List<S> checkedList(List<S>, S.class) • checkedCollection • checkedMap • … Java Advanced / Новые возможности Java 5

  19. Часть 2 Реализация Generic

  20. Проблема 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

  21. Решение 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

  22. Проблема 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

  23. Решение 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

  24. Проблема 3 • Метод void addAll(Object[] a, Collection<?> c) { for (int i = 0; i < a.length; i++) { c.add(a[i]); } } Java Advanced / Новые возможности Java 5

  25. Решение 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

  26. Проблема 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

  27. Решение 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

  28. Решение 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

  29. Проблема 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

  30. Решение 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

  31. Ограничения 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

  32. Часть 3 Generics и вариантность

  33. Вариантность • Ковариантность • Согласованность с отношением включения • Контрвариантность • Несогласованность с отношением включения • Инвариантность • Независимость от отношения включения Java Advanced / Новые возможности Java 5

  34. Вариантность функторов (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

  35. Вариантность функторов (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

  36. Правило • Источник • extends • Приемник • super • Источник и приемник • Инвариантный Java Advanced / Новые возможности Java 5

  37. Wildcard Capture (1) void swap(List<?> list, int i, int j) { // ? } Java Advanced / Новые возможности Java 5

  38. Wildcard Capture (2) void swap(List<?> list, int i, int j) { swapImpl(list, i, j); } Java Advanced / Новые возможности Java 5

  39. 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

  40. Часть 4 Смешение generic и не-generic кода

  41. Generic – одинкласс • Примеры List<String> ls; List<Integer> li; ls.getClass() == li.getClass() // True ls instanceof List // True ls instanceof List<String> Java Advanced / Новые возможности Java 5

  42. Пример кода 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

  43. Код без 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

  44. Преобразование типов • Уничтожение информации о типе • List l = new ArrayList<String>(); • Добавление информации о типе • List<String> l = (List<String>) new ArrayList(); • List<String> l1 = new ArrayList(); • Unchecked warning Java Advanced / Новые возможности Java 5

  45. Часть 5 Autoboxing

  46. Примитивные типы и обертки Java Advanced / Новые возможности Java 5

  47. Boxing и Unboxing • Boxing – заключение значения примитивного типа в обертку int a = …; new Integer(a) • Unboxing – извлечение значения примитивного типа из обертки Integer a = …; a.intValue() Java Advanced / Новые возможности Java 5

  48. Autoboxing • Генерация кода для boxing и unboxing при необходимости • Явное приведение типов • (Integer) 10 • (int) new Integer(10) • (Object) 10 • Приведение типов “по ходу” Java Advanced / Новые возможности Java 5

  49. Пример • Исходный код 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

  50. Пример. Подсчет количеств слов 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

More Related