Java. Generic - шаблонные типы.

gmmagistr 10,410 views 31 slides Mar 22, 2017
Slide 1
Slide 1 of 31
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31

About This Presentation

Шаблонные типы. Шаблонные методы. Wildvcards.


Slide Content

Шаблоны (Generic).
Виталий Унгурян
[email protected]

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

Обобщения (Generic)
Обобщения - это параметризованные
типы. С их помощью можно объявлять
классы, интерфейсы и методы, где тип
данных указан в виде параметра.
Обобщения - добавили в язык java
безопасность типов.

Пример реализации без шаблонов
class Box {
private Object value;
public Box(Object value) {
this.value = value;
}
public Object get() {
return value;
}
}

Пример с шаблонным типом
class Box <E>{
private E value;
public Box(E value) {
this.value = value;
}
public E get() {
return value;
}
}

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

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

Использование
Box<Tea>  box1 = new 
 Box<Tea>(new Tea());
Tea tea = box1.get();
Box<Coffee>  box 2 = new 
 Box<Coffee> (new Coffee ());
Coffee tea = box2.get();

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

Несовместимость generic-типов
Для того чтобы сохранить целостности 
и независимости друг от друга, у 
Generics существует так называемая 
"Несовместимость generic-типов".
List<Integer> li = new ArrayList<Integer>();
List<Object> lo = li;
lo.add(“hello”);

Ограничения Generic
Невозможно создать объект generic
типа, поскольку компилятор не знает, 
какой конструктор вызвать.
private static <T> T get(T value) {
   return new T();  
}

Ограничения Generic
Невозможно реализовывать 
одновременно два одинаковых 
интерфейса с разными типами.
public class DecimalString implements 
Comparable<Number>, 
Comparable<String> {}

Ограничения Generic
Невозможно объявить статическое
поле generic типа
public class MyClass<T> {
   private static T value; 
}

Ограничения Generic
Невозможно использовать instatceof
для параметризованного типа.
public static <E> void setList(List<E> list) {
   if (list instanceof ArrayList<Integer>) {}  
}

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

Ограничения Generic
Невозможно перегрузить метод, в
котором типы параметров
“стираются” до одного и того же
типа.
public void print(Set<String> strSet) { }
public void print(Set<Integer> intSet) { }

Шаблоны аргументов (Wildcards )
Wildcard Parameters (wildcards).
Этот термин в разных источниках
переводится по-разному:
метасимвольные аргументы,
подстановочные символы,
групповые символы, шаблоны,
маски и т.д.

Шаблоны аргументов (Wildcards )
Шаблон аргументов указывается
символом ? и представляет собой
неизвестный тип.
Object obj = new Object();
Box<?> box3 = new Box<Object>(obj );

Wildcards
Одно из преимуществ wildcards состоит
в том, что они дают возможность
написать код, который может
оперировать различными generic-
типами без знания их точных границ.
public void unbox(Box<?> box) {
System.out.println(box.get());
}

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

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

Wildcards
Вспомогательный метод reboxHelper()
является generic-методом. Generic-методы
вводят дополнительные параметры типов
(помещаемые в угловые скобки перед
типом возвращаемого значения), которые
обычно используются для
формулирования ограничений типов
между параметрами и/или возвращаемым
значением метода.

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

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

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

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

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

Пример универсального метода
class Utilities {
public static <T> void fill(List<T> list, T val)
{
for (int i = 0; i < list.size(); i++)
list.set(i, val);
}
}

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

Как это работает?
Во время компиляции
generic-параметры
убираются, и, там, где это
требуется, вместо них
вставляется приведение
типов.
Tags