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