Учебники

Groovy — Дженерики

Обобщения позволяют типам (классам и интерфейсам) быть параметрами при определении классов, интерфейсов и методов. Подобно более знакомым формальным параметрам, используемым в объявлениях методов, параметры типа предоставляют вам возможность повторно использовать один и тот же код с разными входами. Разница в том, что входные данные для формальных параметров являются значениями, а входные данные для параметров типа являются типами.

Универсальный для коллекций

Классы коллекций, такие как класс List, могут быть обобщены так, что в приложении принимаются только коллекции этого типа. Пример обобщенного ArrayList показан ниже. Следующее утверждение делает то, что оно принимает только те элементы списка, которые имеют строку типа —

List<String> list = new ArrayList<String>();

В следующем примере кода мы делаем следующее:

  • Создание коллекции Generalized ArrayList, которая будет содержать только строки.
  • Добавьте 3 строки в список.
  • Для каждого элемента в списке выведите значение строки.

Live Demo

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.

Мы создаем класс с именем ListType. Обратите внимание на ключевые слова <T>, расположенные перед определением класса. Это говорит компилятору, что этот класс может принимать любой тип. Поэтому, когда мы объявляем объект этого класса, мы можем указать тип во время объявления, и этот тип будет заменен в заполнителе <T>

Универсальный класс имеет простые методы получения и установки для работы с переменной-членом, определенной в классе.

Обратите внимание, что в основной программе мы можем объявлять объекты класса ListType, но разных типов. Первый тип Integer, а второй тип String.

Live Demo

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;
   } 
}

Результатом вышеупомянутой программы будет —