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