Скачать презентацию Язык программирования JAVA Generics Содержание Что такое Скачать презентацию Язык программирования JAVA Generics Содержание Что такое

JavaSE_part_3_generics.ppt

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

Язык программирования JAVA Generics Язык программирования JAVA Generics

Содержание Что такое generics? Зачем? Ошибка выполнения Преимущества Ошибка компиляции Терминалогия Параметризация Wildcard Параметры Содержание Что такое generics? Зачем? Ошибка выполнения Преимущества Ошибка компиляции Терминалогия Параметризация Wildcard Параметры с ограничениями Ограничения использования

Что такое generics? Обобщения (generics) — это параметризированные типы. Обобщенные: типы (generic types) ●классы Что такое generics? Обобщения (generics) — это параметризированные типы. Обобщенные: типы (generic types) ●классы (без enum, исключений, анонимных!) ●интерфейсы (без аннотаций!) ●методы (generic methods) ●конструкторы (generic constructors)

До Java 5. 0 class Box { private Object item; public void set. Item До Java 5. 0 class Box { private Object item; public void set. Item (Object o) { item = o; } public Object get. Item () { return item; } } public class Test { public static void main(String[] args) { Box box = new Box(); box. set. Item("hello"); String str 1 = (String)box. get. Item(); System. out. println(str 1); } } Результат выполнения: hello

Ошибка выполнения class Box { private Object item; public void set. Item (Object o) Ошибка выполнения class Box { private Object item; public void set. Item (Object o) { item = o; } public Object get. Item () { return item; } } public class Test { public static void main(String[] args) { Box box = new Box(); box. set. Item("hello"); Integer int 1 = (Integer)box. get. Item(); //Exception System. out. println(int 1); } } Результат выполнения: Exception in thread "main" java. lang. Class. Cast. Exception: java. lang. String cannot be cast to java. lang. Integer

Зачем? Контейнеры ● гетерогенные ● гомогенные class Box<T> { private T item; public void Зачем? Контейнеры ● гетерогенные ● гомогенные class Box { private T item; public void set. Item (T o) { item = o; } public T get. Item () { return item; } } Параметризация ● типов ● методов public ● конструкторов class Test { public static void main(String[] args) { Box box = new Box(); box. set. Item("hello"); String str 1 = box. get. Item(); System. out. println(str 1); } }

Преимущества Определение ошибок использования типов на этапе компиляции. Использование параметризованных - типов - методов Преимущества Определение ошибок использования типов на этапе компиляции. Использование параметризованных - типов - методов - конструкторов Использование wildcards - с ограничениями - без ограничений

Ошибка компиляции сlass Box<T> { private T item; public void set. Item (T o) Ошибка компиляции сlass Box { private T item; public void set. Item (T o) { item = o; } public T get. Item () { return item; } } public class Test { public static void main(String[] args) { Box box = new Box(); box. set. Item(1234567); //Exception String str 1 = box. get. Item(); System. out. println(str 1); } } Compilation completed with 1 error Error: java: incompatible types: int cannot be converted to java. lang. String

Терминология Generic: class A<T> {…} класс public <T> A() {…} конструктор public <T> T Терминология Generic: class A {…} класс public A() {…} конструктор public T m(T t) {…} метод T – параметр generic-а

Параметризация Подстановка вместо параметра конкретного значения при использовании generic: Параметризованный класс: A<String> a = Параметризация Подстановка вместо параметра конкретного значения при использовании generic: Параметризованный класс: A a = new A(); Обобщения действуют только со ссылочными типами

Класс с двумя параметрами class Box<T, V> { private T item; private V item Класс с двумя параметрами class Box { private T item; private V item 2; public Box(T o, V o 2) { item = o; item 2 = o 2; } }

Wildcard Использование generic с указанием wildcards: ? extends <== extends wildcard ? super <== Wildcard Использование generic с указанием wildcards: ? extends <== extends wildcard ? super <== super wildcard ? <== unbounded wildcard class Box<Т> {} Generic класс: class Human { public void class A {…} use. Box(Box box) {} } public class Test { public static void main(String[] args) { Box string. Box = new Box<>(); Wildcard параметризованный класс: Box number. Box = new Box<>(); Human human = new Human(); A a = new A(); human. use. Box(string. Box); A a = new human. use. Box(number. Box); } A(); } A a = new A();

Параметры с ограничениями При объявлении можно наложить ограничения на значение параметра generic. class A Параметры с ограничениями При объявлении можно наложить ограничения на значение параметра generic. class A {…} J 1, J 2 - интерфейсы При использовании класса A если B – интерфейс T – интерфейс, обязан наследовать B, J 1, J 2, если B – класс T – класс, обязан наследовать B, реализовывать J 1, J 2

Ограничение сверху class Box <T extends Number>{ private T item; public void set. Item Ограничение сверху class Box { private T item; public void set. Item (T o) { item = o; } public Integer get. Int. Value () { return item. int. Value(); } } public class Test { public static void main(String[] args) { Box box = new Box<>(); box. set. Item(123. 45 F); Integer int 1 = box. get. Int. Value(); System. out. println(int 1); } }

Обобщенные интерфейсы interface Box<Т> { set. Item(T item); } class Box. Impl implements Box<String> Обобщенные интерфейсы interface Box<Т> { set. Item(T item); } class Box. Impl implements Box { public void set. Item(String item) {} } public class Test { public static void main(String[] args) { Box string. Box = new Box. Impl<>(); string. Box. set. Item("Hello World"); } }

Иерархия классов class Box<Т> { public void set. Item (T item) {} } class Иерархия классов class Box<Т> { public void set. Item (T item) {} } class Big. Box extends Box { public void set. Big. Items(K item, T item 2) {} } public class Test { public static void main(String[] args) { Big. Box string. Box = new Big. Box<>(); string. Box. set. Item("Very big item", 23); } }

Ограничения использования Внутри generic нельзя: ● ● ● создать объект этого типа создать массив Ограничения использования Внутри generic нельзя: ● ● ● создать объект этого типа создать массив такого типа использовать в секции catch использовать в статическом контексте использовать в instanceof (справа) наследовать

Вопросы? Вопросы?