Скачать презентацию Мультимедийный курс Программирование на Java Лекция 6 1 Скачать презентацию Мультимедийный курс Программирование на Java Лекция 6 1

04_2_Лекция_Параметризованые_типы_2014.ppt

  • Количество слайдов: 29

Мультимедийный курс Программирование на Java Лекция 6. 1 Параметризированные типы (Обобщения, Generics) Мультимедийный курс Программирование на Java Лекция 6. 1 Параметризированные типы (Обобщения, Generics)

Параметризированные типы Параметризированные (generic) типы - классы, интерфейсы и методы, в которых тип обрабатываемых Параметризированные типы Параметризированные (generic) типы - классы, интерфейсы и методы, в которых тип обрабатываемых данных задается как параметр (параметр типа). Параметризированные типы, позволяют использовать типы более гибкую и в то же время достаточно строгую типизацию, обеспечивая безопасность типов 1. Ограничение типа, применение метасимволов 2. Настраиваемые методы, интерфейсы иерархии классов 3. Параметры типа, параметризированные классы 4. Реализация настраиваемых типов, ограничения по применению 2

Параметризированные типы Классы, использующие параметр типа, являются настраиваемыми классами или параметризованными типами Применение параметризированного Параметризированные типы Классы, использующие параметр типа, являются настраиваемыми классами или параметризованными типами Применение параметризированного класса: Gen iob = new Gen(88) ; Полная идентичность аргументов типа 3

Параметризированные типы Аргумент типа, задаваемый при объявлении параметризированного типа – может быть только классом, Параметризированные типы Аргумент типа, задаваемый при объявлении параметризированного типа – может быть только классом, а не примитивным типом !!! Разные аргументы: Gen iob = new Gen(88) ; Gen str. Ob = new Gen ("Generics Test"); iob = str. Ob; // Неверно - разные типы !!! Gen s = new Gen(777) ; . /* Неверно - разные типы !!! т. е. ссылка на одну конкретную версию обобщенного типа несовместима с другой версией того же самого обобщенного типа. */ 4

Параметризированные типы Пример1: Параметризированный класс с одним параметром типа: package chapt 03; public class Параметризированные типы Пример1: Параметризированный класс с одним параметром типа: package chapt 03; public class Optional { private T value; public Optional() { } public Optional(T value) { this. value = value; } public T get. Value() { return value; } public void set. Value(T val) { value = val; } public String to. String() { if (value == null) return null; return value. get. Class(). get. Name() + " " + value; } } 5

Параметризированные типы Пример1: Параметризированный класс с одним параметром типа: package chapt 03; public class Параметризированные типы Пример1: Параметризированный класс с одним параметром типа: package chapt 03; public class Runner { public static void main(String[] args) { //параметризация типом Integer Optional ob 1 = new Optional(); ob 1. set. Value(1); //ob 1. set. Value("2"); // ошибка компиляции: недопустимый тип int v 1 = ob 1. get. Value(); System. out. println(v 1); //параметризация типом String Optional ob 2 = new Optional("Java"); String v 2 = ob 2. get. Value(); System. out. println(v 2); //ob 1 = ob 2; //ошибка компиляции – параметризация не ковариантна 6

Параметризированные типы Пример1: Параметризированный класс с одним параметром типа: //параметризация по умолчанию – Object Параметризированные типы Пример1: Параметризированный класс с одним параметром типа: //параметризация по умолчанию – Object Optional ob 3 = new Optional(); System. out. println(ob 3. get. Value()); ob 3. set. Value("Java SE 6"); System. out. println(ob 3. to. String()); /* выводится тип объекта, а не тип параметризации */ ob 3. set. Value(71); System. out. println(ob 3. to. String()); ob 3. set. Value(null); } } В результате выполнения этой программы будет выведено: 1 Java null java. lang. String Java SE 6 java. lang. Integer 71 7

Параметризированные типы Пример1: Параметризированный класс с одним параметром типа: В следующей строке кода: class Параметризированные типы Пример1: Параметризированный класс с одним параметром типа: В следующей строке кода: class Gen { , где Т обозначает имя параметра типа. Это имя используется в качестве заполнителя, вместо которого в дальнейшем подставляется имя конкретного типа, передаваемого классу Gen при создании объекта. Обозначение Т применяется в классе Gen всякий раз, когда требуется параметр типа. Всякий раз. когда объявляется параметр типа, он указывается в угловых скобках < >. 8

Параметризированные типы Параметризированный класс с несколькими параметрами типа: // Два параметра типа задаются списком Параметризированные типы Параметризированный класс с несколькими параметрами типа: // Два параметра типа задаются списком через запятую class Two. Gen { Т ob 1; V ob 2; Two. Gen(Т o 1, V о 2) { // конструктор оb 1 = o 1; оb 2 = о 2; } // Использование класса Two. Gen tg. Obn = new Two. Gen (88, "Generics"); 9

Параметризированные типы Ограничения на типы, передаваемые параметру типа: Ø В качестве верхней границы задается Параметризированные типы Ограничения на типы, передаваемые параметру типа: Ø В качестве верхней границы задается суперкласс, от которого должны быть унаследованы все аргументы типа: Gen <Т extends superclass> Gen <Т extends Number> Аргументы параметра типа в этом случае: ü только тип Number или его подклассы Integer, Float 10

Параметризированные типы Применение метасимвольных аргументов необходимо в случае, если параметр типа невозможно определить Метасимвол: Параметризированные типы Применение метасимвольных аргументов необходимо в случае, если параметр типа невозможно определить Метасимвол: ? 11

Параметризированные типы Пример class Stats<T> { Т[] nums; Stats(T[] о) { nums = о; Параметризированные типы Пример class Stats { Т[] nums; Stats(T[] о) { nums = о; } // Вычисляет среднее арифметич. элементов массива double average() { double sum = 0. 0; for (int i=0; i < nums. length; i++) sum += nums[i]. double. Value(); // метод кл. Number – приводит к // типу Double return sum / nums. length; } } 12

Параметризированные типы Пример (продолжение) // любой объект типа Stats, // если Т, то ожидается Параметризированные типы Пример (продолжение) // любой объект типа Stats, // если Т, то ожидается тип передаваемый вызывающим объектом boolean same. Avg(Stats ob) { if (average() == ob. average()) return true; else return false; }. . . Integer inums[] = { 1, 2, 3, 4, 5 }; Double dnums[] = { 1. 1, 2. 2, 3. 3, 4. 4, 5. 5 }; Stats iob = new Stats(inums); Stats dob = new Stats(dnums); System. out. print("Средние арифметические iob и dob "); if (iob. same. Avg (dob) ) // вызывающий об. и параметр – // объекты одного класса System. out. println("совпадают. "); else System, out. println("отличаются. "); . . . 13

Параметризированные типы Ограничение метасимвольных аргументов Задание верхней границы: <? extends superclass> superclass - имя Параметризированные типы Ограничение метасимвольных аргументов Задание верхней границы: superclass - имя класса, который служит верхней границей Задание нижней границы: Допустимые аргументы - суперклассы класса subclass не является допустимым типом аргумента 14

Параметризированные типы Пример static void show. XYZ(Coords<? extends Three. D> c) { System. out. Параметризированные типы Пример static void show. XYZ(Coords c) { System. out. println("X Y Z Coordinates: "); for(int i=0; i < c. coords. length; i++) System. out. println(c. coords [i]. x + " " + с. coords[i]. у + " " + с. coords[i]. z); System. out. println(); } 15

Параметризированные типы Параметризированные методы v могут иметь один или несколько собственных параметров типа v Параметризированные типы Параметризированные методы v могут иметь один или несколько собственных параметров типа v могут создаваться и внутри непараметризированного класса v могут быть как статическими, так и нестатическими Синтаксис записи <список_парам. _типа> возвр. _знач. имя_метода(список_парам. ) {. . . } Пример: static <Т, V extends Т> boolean is. In(T х, V[] у) { 16

Параметризированные типы Пример: // Параметризированный метод static <Т, V extends Т> boolean is. In(T Параметризированные типы Пример: // Параметризированный метод static <Т, V extends Т> boolean is. In(T х, V[] у) { for(int i=0; i < y. length; i++) if(x. equals(y[i])) return true; return false; } // Вызов метода public static void main(String args[]) { Integer nums[] = { 1, 2, 3, 4, 5 }; if(is. In(2, nums)) System. out. println("2 содержится в массиве"); } 17

Параметризированные типы Пример: class Gen. Cons { private double val; <T extends Number> Gen. Параметризированные типы Пример: class Gen. Cons { private double val; Gen. Cons(T arg) { // Параметризированный только метод val = arg. double. Value(); } } void showval() { System. out. println("val: " + val); } class Gen. Cons. Demo { public static void main(String args[]) { Gen. Cons test = new Gen. Cons(100); Gen. Cons test 2 = new Gen. Cons(123. 5 F); test. showval(); test 2. showval(); } } Вывод программы: val: 100, 0 val: 123, 5 18

Параметризированные типы Настраиваемые интерфейсы v задаются так же, как настраиваемые классы interface Min. Max<T Параметризированные типы Настраиваемые интерфейсы v задаются так же, как настраиваемые классы interface Min. Max> { v класс, реализующий интерфейс Та же граница Class My. Class> implements Min. Max { Не повторяется 19

Параметризированные типы Иерархии параметризированных классов v параметризированный класс может быть суперклассом или быть подклассом Параметризированные типы Иерархии параметризированных классов v параметризированный класс может быть суперклассом или быть подклассом v аргументы типа, необходимые суперклассу, должны передаваться всем подклассам !!! class Gen { T ob; Gen(T o) { ob = o; } T getob() { return ob; } } class Gen 2 extends Gen{ Gen 2(T o) { super(o); // передача суперклассу } } … Gen 2 x = new Gen 2(108); System. out. print(x. getob()); 20

Параметризированные типы Иерархии настраиваемых классов (продолжение) v в подклассе всегда определяются параметры типа, требующиеся Параметризированные типы Иерархии настраиваемых классов (продолжение) v в подклассе всегда определяются параметры типа, требующиеся для его настраиваемого суперкласса v подкласс может иметь собственные параметры типа class Gen 2 extends Gen { V оb 2; Gen 2(T о, V o 2) { super(o); // передача аргумента типа // конструктору супертипа ob 2 = o 2; } } 21

Параметризированные типы Применение настраиваемых типов в коллекциях v все классы и интерфейсы, связанные с Параметризированные типы Применение настраиваемых типов в коллекциях v все классы и интерфейсы, связанные с классами Аrray. List, Linked. List и Tree. Set параметризированные: Array. List list = new Array. List(); v преимущества: гарантируется сохранение в коллекции ссылок на объекты только нужного типа n исключается необходимость явного приведения типа ссылки, при извлечении из коллекции n 22

Параметризированные типы Сравнение типов настраиваемой иерахии: операция объект instanceof тип возвращает true, если объект Параметризированные типы Сравнение типов настраиваемой иерахии: операция объект instanceof тип возвращает true, если объект имеет заданный тип или м. б. преобразован к нему if (i. Ob instanceof Gen 2) System. out. println("i. Ob совместим с Gen 2"); Приведение типов: преобразование одного экземпляра параметризированного класса в другой (Gen) iob 2 если они взаимно совместимы 23

Параметризированные типы Реализация в Java обобщенных типов При компиляции: v информация о обобщенных типах Параметризированные типы Реализация в Java обобщенных типов При компиляции: v информация о обобщенных типах удаляется (эффект стирания) v параметры типа заменяются ограничивающими их типами (если заданы) либо Object v все параметризованные классы используют один класс: Gen i. Ob = new Gen(99); Gen f. Ob = new Gen(102. 2 F); Systern. out. println(i. Ob. getclass (). get. Name()) ; System, out. println(f. Ob. get. Class (). get. Name()); Результат: Gen 24

Параметризированные типы Поэтому нельзя: запрашивать тип в процессе выполнения программы public class My. List<E> Параметризированные типы Поэтому нельзя: запрашивать тип в процессе выполнения программы public class My. List { public E[] to. Array() { return new E[5]; // compile error } public boolean can. Add(Object o) { return (o instanceof E); // compile error –} public E convert. To. E(Object o) { return (E) o; // compile warning, unchecked cast } } 25

Параметризированные типы Raw Type v Можно создать объект настраиваемого (генефицированного) класса без указания типов Параметризированные типы Raw Type v Можно создать объект настраиваемого (генефицированного) класса без указания типов аргументов v Классы Pre-J 2 SE 5. 0 продолжают функционировать под J 2 SE 5. 0 JVM как raw тип // ? ? ? List ls = new Linked. List(); // Raw type List lraw = new Linked. List(); 26

Параметризированные типы Ограничения T t = new T(); // конструктор ? ü Статические члены Параметризированные типы Ограничения T t = new T(); // конструктор ? ü Статические члены класса не могут использовать параметры типа static T t; //? ? ? 27

Параметризированные типы Ограничения (продолжение) Создание экземпляров универсальных типов class Test<T> { T values; //ok Параметризированные типы Ограничения (продолжение) Создание экземпляров универсальных типов class Test { T values; //ok Test(T[] n) { values = new T[10]; } } values = n; // базовый тип - параметр типа //ok Массивы Test i. Test[] = new Test[10] нельзя объявлять с аргументами типа Test i. Test[] = new Test[10] // //ok 28

Параметризированные типы Ограничения (продолжение) ü Исключения Невозможно сгенерировать или перехватить исключение, описываемое универсальным объектом Параметризированные типы Ограничения (продолжение) ü Исключения Невозможно сгенерировать или перехватить исключение, описываемое универсальным объектом n создать параметризированный класс, расширяющий класс Throwable n n использовать параметр типа в выражении catch Допустимо использовать параметр типа в выражении throws 29