Шаблоны (Generic)

Содержание

Слайд 2

Что такое шаблоны? Обобщённое программирование — это такой подход к описанию

Что такое шаблоны?

Обобщённое программирование — это такой подход к описанию данных

и алгоритмов, который позволяет их использовать с различными типами данных без изменения их описания. Generics (дженерики) или <<контейнеры типа T>> — подмножество обобщённого программирования.
Слайд 3

Обобщения (Generic) Обобщения - это параметризованные типы. С их помощью можно

Обобщения (Generic)

Обобщения - это параметризованные типы. С их помощью можно объявлять

классы, интерфейсы и методы, где тип данных указан в виде параметра.
Обобщения - добавили в язык java безопасность типов.
Слайд 4

Слайд 5

Пример реализации без шаблонов class Box { private Object value; public

Пример реализации без шаблонов

class Box {
private Object value;
public

Box(Object value) {
this.value = value;
}
public Object get() {
return value;
}
}
Слайд 6

Пример с шаблонным типом class Box { private E value; public

Пример с шаблонным типом

class Box {
private E value;
public Box(E

value) {
this.value = value;
}
public E get() {
return value;
}
}
Слайд 7

Синтаксис После имени класса в угловых скобках " " указано имя

Синтаксис

После имени класса в угловых скобках "<" и ">" указано

имя типа “E", которое может использоваться внутри класса.
Фактически E – это тип, который должен быть определён позже (при создании объекта класса).
Слайд 8

Правила именования типов В именах переменных типа принято использовать заглавные буквы.

Правила именования типов

В именах переменных типа принято использовать заглавные буквы.
Обычно

для коллекций используется буква E, буквами K и V - типы ключей и значение (Key/Value), а буквой T (и при необходимости буквы S и U) - любой тип.
Слайд 9

Использование Box box1 = new Box (new Tea()); Tea tea =

Использование

Box  box1 = new  Box(new Tea());
Tea tea = box1.get();
Box  box 2 = new

 Box (new Coffee ());
Coffee tea = box2.get();
Слайд 10

Алмазный синтаксис Чтобы упростить жизнь программистам в Java 7 был введён

Алмазный синтаксис

Чтобы упростить жизнь программистам в Java 7 был введён алмазный

синтаксис (diamond syntax), в котором можно опустить параметры типа.
Т.е. можно предоставить компилятору определение типов при создании объекта. Вид упрощённого объявления:
Pair pair = new Pair<>(6, " Apr"); 
Слайд 11

Несовместимость generic-типов Для того чтобы сохранить целостности и независимости друг от

Несовместимость generic-типов

Для того чтобы сохранить целостности и независимости друг от друга,

у Generics существует так называемая "Несовместимость generic-типов".
List li = new ArrayList();
List lo = li;
lo.add(“hello”);
Слайд 12

Ограничения Generic Невозможно создать объект generic типа, поскольку компилятор не знает,

Ограничения Generic

Невозможно создать объект generic типа, поскольку компилятор не знает, какой конструктор

вызвать.
private static T get(T value) {    return new T();  
}
Слайд 13

Ограничения Generic Невозможно реализовывать одновременно два одинаковых интерфейса с разными типами.

Ограничения Generic

Невозможно реализовывать одновременно два одинаковых интерфейса с разными типами.
public class

DecimalString implements Comparable, Comparable {}
Слайд 14

Ограничения Generic Невозможно объявить статическое поле generic типа public class MyClass

Ограничения Generic

Невозможно объявить статическое поле generic типа
public class MyClass {    private

static T value; 
}
Слайд 15

Ограничения Generic Невозможно использовать instatceof для параметризованного типа. public static void

Ограничения Generic

Невозможно использовать instatceof для параметризованного типа.
public static void setList(List

list) {    if (list instanceof ArrayList) {}   }
Слайд 16

Ограничения Generic Невозможно создать массив параметризированного типа Box [] arrayOfLists = new Box [2];

Ограничения Generic

Невозможно создать массив параметризированного типа
Box[] arrayOfLists = new Box[2];

Слайд 17

Ограничения Generic Невозможно перегрузить метод, в котором типы параметров “стираются” до

Ограничения Generic

Невозможно перегрузить метод, в котором типы параметров “стираются” до одного

и того же типа.
public void print(Set strSet) { } public void print(Set intSet) { }
Слайд 18

Шаблоны аргументов (Wildcards ) Wildcard Parameters (wildcards). Этот термин в разных

Шаблоны аргументов (Wildcards )

Wildcard Parameters (wildcards).
Этот термин в разных источниках

переводится по-разному: метасимвольные аргументы, подстановочные символы, групповые символы, шаблоны, маски и т.д.
Слайд 19

Шаблоны аргументов (Wildcards ) Шаблон аргументов указывается символом ? и представляет

Шаблоны аргументов (Wildcards )

Шаблон аргументов указывается символом ? и представляет собой

неизвестный тип.
Object obj = new Object();
Box box3 = new Box(obj );
Слайд 20

Wildcards Одно из преимуществ wildcards состоит в том, что они дают

Wildcards

Одно из преимуществ wildcards состоит в том, что они дают возможность

написать код, который может оперировать различными generic-типами без знания их точных границ. 
Слайд 21

Wildcards public void rebox(Box box) { box.put(box.get()); }

Wildcards

public void rebox(Box box) {
box.put(box.get());
}

Слайд 22

Wildcards public void rebox(Box box) { reboxHelper(box); } private void reboxHelper(Box box) { box.put(box.get()); }

Wildcards

public void rebox(Box box) {
reboxHelper(box);
}
private void reboxHelper(Box box)

{
box.put(box.get());
}
Слайд 23

Wildcards Вспомогательный метод reboxHelper() является generic-методом. Generic-методы вводят дополнительные параметры типов

Wildcards

Вспомогательный метод reboxHelper() является generic-методом. Generic-методы вводят дополнительные параметры типов (помещаемые

в угловые скобки перед типом возвращаемого значения), которые обычно используются для формулирования ограничений типов между параметрами и/или возвращаемым значением метода.
Слайд 24

Wildcards Однако в случае reboxHelper() generic-метод не задействует параметр типа для

Wildcards

Однако в случае reboxHelper() generic-метод не задействует параметр типа для определения

ограничения типа, а позволяет компилятору – через вывод типа – дать имя параметру типа переменной box. Приём с capture-хелпером основан на выводе типов (type inference) и преобразовании при фиксации (capture conversion). 
Слайд 25

Маски с ограничением extends Box box3 = new Box (new Coffee());

Маски с ограничением extends

Box box3 = new Box(new Coffee());
Box

extends Tea> box3 = new Box(new Tea());
Слайд 26

Маски с ограничением super Box box3 = new Box (new Coffee());

Маски с ограничением super

Box box3 = new Box(new Coffee());

Слайд 27

Универсальные методы (Generic methods) По аналогии с универсальными классами (дженерик-классами), можно

Универсальные методы (Generic methods)

По аналогии с универсальными классами (дженерик-классами), можно создавать

универсальные методы (дженерик-методы), то есть методы, которые принимают общие типы параметров.
Слайд 28

Универсальные методы (Generic methods) Универсальные методы не надо путать с методами

Универсальные методы (Generic methods)

Универсальные методы не надо путать с методами в

generic-классе. Универсальные методы удобны, когда одна и та же функциональность должна применяться к различным типам.
Слайд 29

Пример универсального метода class Utilities { public static void fill(List list,

Пример универсального метода

class Utilities {      public static  void fill(List list, T val)  {          for (int i = 0; i < list.size(); i++)              list.set(i, val);      }  } 

Слайд 30

Как это работает? Поддержка generic-ов реализована средствами компилятора. Виртуальная машина не

Как это работает?

Поддержка generic-ов реализована средствами компилятора. Виртуальная машина не предоставляет

никакой поддержки generic-ов, кроме возможности получения информации о типах.