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