Что такое шаблоны?Обобщённое программирование — это такой подход к описанию данных и алгоритмов, который позволяет их использовать с различными типами данных без изменения их описания. Generics (дженерики) или — подмножество обобщённого программирования.
Слайд 5
Пример реализации без шаблонов class Box { private
Object value; public Box(Object value) { this.value =
value; } public Object get() { return value; } }
Слайд 6
Пример с шаблонным типом 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 = box1.get();
Box box
2 = new Box (new Coffee ()); Coffee tea =
box2.get();
Слайд 10
Алмазный синтаксис Чтобы упростить жизнь программистам в Java 7
был введён алмазный синтаксис (diamond syntax), в котором можно
опустить параметры типа. Т.е. можно предоставить компилятору определение типов при создании объекта. Вид упрощённого объявления: Pair pair = new Pair<>(6, " Apr");
Слайд 11
Несовместимость generic-типов Для того чтобы сохранить целостности и независимости
друг от друга, у Generics существует так называемая "Несовместимость
generic-типов".
List li = new ArrayList(); List
Слайд 12
Ограничения Generic Невозможно создать объект generic типа, поскольку компилятор не
знает, какой конструктор вызвать.
private static T get(T value)
{
return new T(); }
Слайд 13
Ограничения Generic Невозможно реализовывать одновременно два одинаковых интерфейса с
разными типами. public class DecimalString implements Comparable, Comparable {}
Слайд 14
Ограничения Generic Невозможно объявить статическое поле generic типа public class
MyClass {
private static T value; }
Слайд 15
Ограничения Generic Невозможно использовать instatceof для параметризованного типа.
public static
void setList(List list) {
if (list instanceof ArrayList)
{}
}
Слайд 16
Ограничения Generic Невозможно создать массив параметризированного типа
Box[] arrayOfLists =
new Box[2];
Слайд 17
Ограничения Generic Невозможно перегрузить метод, в котором типы параметров
“стираются” до одного и того же типа. public void print(Set
strSet) { }
public void print(Set intSet) { }
Слайд 18
Шаблоны аргументов (Wildcards ) Wildcard Parameters (wildcards). Этот термин
в разных источниках переводится по-разному: метасимвольные аргументы, подстановочные символы,
Слайд 23
Wildcards Вспомогательный метод reboxHelper() является generic-методом. Generic-методы вводят дополнительные
параметры типов (помещаемые в угловые скобки перед типом возвращаемого
значения), которые обычно используются для формулирования ограничений типов между параметрами и/или возвращаемым значением метода.
Слайд 24
Wildcards Однако в случае reboxHelper() generic-метод не задействует параметр
типа для определения ограничения типа, а позволяет компилятору –
через вывод типа – дать имя параметру типа переменной box. Приём с capture-хелпером основан на выводе типов (type inference) и преобразовании при фиксации (capture conversion).