Groovy - Дженерики
Обобщения позволяют типам (классам и интерфейсам) быть параметрами при определении классов, интерфейсов и методов. Подобно более знакомым формальным параметрам, используемым в объявлениях методов, параметры типа позволяют повторно использовать один и тот же код с разными входными данными. Разница в том, что входными данными для формальных параметров являются значения, а входными данными для параметров типа являются типы.
Универсальный для коллекций
Классы коллекций, такие как класс List, можно обобщить, чтобы в приложение принимались только коллекции этого типа. Пример обобщенного списка ArrayList показан ниже. Что делает следующее утверждение, так это то, что он принимает только элементы списка, которые имеют строку типа:
List<String> list = new ArrayList<String>();
В следующем примере кода мы делаем следующее:
- Создание коллекции Generalized ArrayList, которая будет содержать только строки.
- Добавьте в список 3 строки.
- Для каждого элемента в списке печать значения строк.
class Example {
static void main(String[] args) {
// Creating a generic List collection
List<String> list = new ArrayList<String>();
list.add("First String");
list.add("Second String");
list.add("Third String");
for(String str : list) {
println(str);
}
}
}
Результатом вышеуказанной программы будет -
First String
Second String
Third String
Обобщенные классы
Можно также обобщить весь класс. Это делает класс более гибким в принятии любых типов и соответствующей работе с этими типами. Давайте посмотрим на примере, как мы можем этого добиться.
В следующей программе мы выполняем следующие шаги -
Мы создаем класс под названием ListType. Обратите внимание на ключевые слова <T>, помещенные перед определением класса. Это сообщает компилятору, что этот класс может принимать любой тип. Поэтому, когда мы объявляем объект этого класса, мы можем указать тип во время объявления, и этот тип будет заменен в заполнителе <T>
Универсальный класс имеет простые методы получения и установки для работы с переменной-членом, определенной в классе.
Обратите внимание, что в основной программе мы можем объявлять объекты класса ListType, но разных типов. Первый имеет тип Integer, а второй - тип String.
class Example {
static void main(String[] args) {
// Creating a generic List collection
ListType<String> lststr = new ListType<>();
lststr.set("First String");
println(lststr.get());
ListType<Integer> lstint = new ListType<>();
lstint.set(1);
println(lstint.get());
}
}
public class ListType<T> {
private T localt;
public T get() {
return this.localt;
}
public void set(T plocal) {
this.localt = plocal;
}
}
Результатом вышеуказанной программы будет -
First String
1