Язык программирования JAVA Generics Содержание Что такое generics?

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

41936-javase_part_3_generics.ppt

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>Ограничение сверху            Ограничение сверху class Box { private T item; public void setItem (T o) { item = o; } public Integer getIntValue () { return item.intValue(); } } public class Test { public static void main(String[] args) { Box box = new Box<>(); box.setItem(123.45F); Integer int1 = box.getIntValue(); System.out.println(int1); } }

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

>Иерархия классов            Иерархия классов class Box<Т> { public void setItem (T item) {} } class BigBox extends Box { public void setBigItems(K item, T item2) {} } public class Test { public static void main(String[] args) { BigBox stringBox = new BigBox<>(); stringBox.setItem("Very big item", 23); } }

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

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