Groovy - leki generyczne

Generics umożliwiają typom (klasom i interfejsom) bycie parametrami podczas definiowania klas, interfejsów i metod. Podobnie jak w przypadku bardziej znanych parametrów formalnych używanych w deklaracjach metod, parametry typu umożliwiają ponowne użycie tego samego kodu z różnymi danymi wejściowymi. Różnica polega na tym, że dane wejściowe do parametrów formalnych są wartościami, podczas gdy dane wejściowe do parametrów typu są typami.

Ogólne dla kolekcji

Klasy kolekcji, takie jak klasa List, można uogólnić, tak aby w aplikacji były akceptowane tylko kolekcje tego typu. Przykład uogólnionej ArrayList pokazano poniżej. Poniższa instrukcja akceptuje tylko elementy listy, które są typu ciąg -

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

W poniższym przykładzie kodu wykonujemy następujące czynności -

  • Tworzenie kolekcji uogólnionej ArrayList, która będzie zawierać tylko ciągi znaków.
  • Dodaj 3 ciągi do listy.
  • Dla każdej pozycji na liście wypisywanie wartości ciągów.
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);
      }
   } 
}

Wynik powyższego programu byłby -

First String 
Second String 
Third String

Klasy uogólnione

Całą klasę można również uogólnić. To sprawia, że ​​klasa jest bardziej elastyczna w akceptowaniu dowolnych typów i zgodnie z nimi pracuje. Spójrzmy na przykład, jak możemy to osiągnąć.

W poniższym programie wykonujemy następujące kroki -

  • Tworzymy klasę o nazwie ListType. Zwróć uwagę na słowa kluczowe <T> umieszczone przed definicją klasy. To mówi kompilatorowi, że ta klasa może akceptować dowolny typ. Kiedy więc deklarujemy obiekt tej klasy, możemy określić typ podczas deklaracji i ten typ zostanie zastąpiony w symbolu zastępczym <T>

  • Klasa ogólna ma proste metody pobierające i ustawiające do pracy ze zmienną składową zdefiniowaną w klasie.

  • W głównym programie zauważmy, że jesteśmy w stanie zadeklarować obiekty klasy ListType, ale różnego typu. Pierwszy z nich jest typu Integer, a drugi typu 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;
   } 
}

Wynik powyższego programu byłby -

First String 
1