Слайд 2
Цели
Ознакомиться с Java Generics
Изучить правила использования
Использование масок (Wildcards)
Применить на практике
свои знания о Java Generics
![Цели Ознакомиться с Java Generics Изучить правила использования Использование масок (Wildcards) Применить на](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-1.jpg)
Слайд 3
Введение
Обобщённое программирование — это такой подход к описанию данных и алгоритмов, который позволяет
их использовать с различными типами данных без изменения их описания.
Generics введены с версии Java 1.5
generics (дженерики) или <<контейнеры типа T>> — подмножество обобщённого программирования.
![Введение Обобщённое программирование — это такой подход к описанию данных и алгоритмов, который](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-2.jpg)
Слайд 4
До generics
List strList = new ArrayList();
strList.add("some text");
//ОК, хотя коллекция предназначалась для хранения
строк!
strList.add(new Integer(0));
String str = (String)strList.get(0);
//Ошибка приведения типов во время выполнения (ClassCastException) Integer i = (Integer)strList.get(0);
![До generics List strList = new ArrayList(); strList.add("some text"); //ОК, хотя коллекция предназначалась](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-3.jpg)
Слайд 5
С использованием generics
List strList = new ArrayList();
strList.add("some text");
strList.add(new Integer()); // сообщение об
ошибке компилятора
String str = strList.get(0);
Integer i = strList.get(0); // сообщение об ошибке компилятора
Проверка типов – на этапе компиляции
Отсутствие приведения типов
![С использованием generics List strList = new ArrayList (); strList.add("some text"); strList.add(new Integer());](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-4.jpg)
Слайд 6
«Алмазный» синтаксис Diamonds
Pair pair = new Pair(6, " Apr");
В Java 1.7 введен “diamond” operator <>, с помощью которого можно
опустить параметры типа:
Pair pair = new Pair<>(6, " Apr");
![«Алмазный» синтаксис Diamonds Pair pair = new Pair (6, " Apr"); В Java](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-5.jpg)
Слайд 7
Параметризация класса
public class Test {
private T param;
public Test(T param) {
this.param = param;
}
public T getParam() {
return this.param;
}
}
![Параметризация класса public class Test { private T param; public Test(T param) {](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-6.jpg)
Слайд 8
Параметризация класса
class Pair {
T1 object1;
T2 object2;
Pair(T1 one, T2 two) {
object1 = one;
object2 = two;
}
public T1 getFirst() {
return object1;
}
public T2 getSecond() {
return object2;
}
}
![Параметризация класса class Pair { T1 object1; T2 object2; Pair(T1 one, T2 two)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-7.jpg)
Слайд 9
Параметризация класса
class PairOfT {
T object1;
T object2;
PairOfT(T one, T two) {
object1 = one;
object2 = two;
}
public T getFirst() {
return object1;
}
public T getSecond() {
return object2;
}
}
![Параметризация класса class PairOfT { T object1; T object2; PairOfT(T one, T two)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-8.jpg)
Слайд 10
Параметризация методов (Generic methods)
Универсальными могут быть кроме классов также и методы
public static void fill(List list, T val) {…}
public
T getData(T data) { return data; }
![Параметризация методов (Generic methods) Универсальными могут быть кроме классов также и методы public](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-9.jpg)
Слайд 11
Пример
package ru.sbertech.lession4;
import java.util.ArrayList;
import java.util.List;
class Utilities {
public static void fill(List list, T val) {
for (int i = 0; i < list.size(); i++)
list.set(i, val);
}
}
class Test {
public static void main(String[] args) {
List intList = new ArrayList<>();
intList.add(1);
intList.add(2);
System.out.println("Список до обработки дженерик-методом: " + intList);
Utilities.fill(intList, 0);
System.out.println("Список после обработки дженерик-методом: "
+ intList);
}
}
![Пример package ru.sbertech.lession4; import java.util.ArrayList; import java.util.List; class Utilities { public static void](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-10.jpg)
Слайд 12
Вопрос по использованию generics
какая (-ие) из нижеприведённых строк откомпилируется без проблем?
1. List list = new List();
2. List list = new ArrayList();
3. List list = new ArrayList();
4. List list = new ArrayList();
![Вопрос по использованию generics какая (-ие) из нижеприведённых строк откомпилируется без проблем? 1.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-11.jpg)
Слайд 13
Wildcards (Маски)
//Ошибка компиляции (нарушение типобезопасности)
List intList = new ArrayList();
![Wildcards (Маски) //Ошибка компиляции (нарушение типобезопасности) List intList = new ArrayList ();](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-12.jpg)
Слайд 14
Wildcards (Маски)
//Этот код скомпилируется
List> intList = new ArrayList();
Однако при попытке
intList.add(new Integer(10));
Получим ошибку компиляции
При использовании маски > мы
не знаем, какого типа аргумент может быть передан.
List super Integer> intList = new ArrayList();
intList.add(new Integer(10));
![Wildcards (Маски) //Этот код скомпилируется List intList = new ArrayList (); Однако при](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-13.jpg)
Слайд 15
ограниченные маски (Bounded wildcards)
(PECS Producer Extends Consumer Super)
extends T>
public static Double sum(List extends Number> numList) {
Double result = 0.0;
for (Number num : numList) {
result += num.doubleValue();
}
return result;
}
![ограниченные маски (Bounded wildcards) (PECS Producer Extends Consumer Super) public static Double sum(List](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-14.jpg)
Слайд 16
super T>
class Test {
…
public static void addValue(List super T> dest, T
value) {
list.add(value);
}
…
}
Использование
List list = new ArrayList<>();
Test. addValue(list, new Integer(1));
Test. addValue(list, new Double(2));
![class Test { … public static void addValue(List dest, T value) { list.add(value);](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-15.jpg)
Слайд 17
Пример super T> и extends T>
public class CollectionsUtil {
public
static void copy(List super T> dest, List extends T> src) {
for (int i=0; i dest.set(i,src.get(i));
}
}
![Пример и public class CollectionsUtil { public static void copy(List dest, List src)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-16.jpg)
Слайд 18
Вопросы для самоконтроля
Как параметризировать класс
Как параметризировать метод
Использование super T>
Использование extends T>
![Вопросы для самоконтроля Как параметризировать класс Как параметризировать метод Использование Использование](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-17.jpg)
Слайд 19
Задание для самоконтроля
Необходимо написать свой LinkedList
Методы:
add(E e)
add(int index, E element)
E get(int index)
E remove(int index)
Iterator iterator()
с
использованием wildcards:
boolean addAll(Collection c)
boolean copy(Collection c)
![Задание для самоконтроля Необходимо написать свой LinkedList Методы: add(E e) add(int index, E](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/408545/slide-18.jpg)