Обобщения позволяют типам (классам и интерфейсам) быть параметрами при определении классов, интерфейсов и методов. Подобно более знакомым формальным параметрам, используемым в объявлениях методов, параметры типа предоставляют вам возможность повторно использовать один и тот же код с разными входами. Разница в том, что входные данные для формальных параметров являются значениями, а входные данные для параметров типа являются типами.
Универсальный для коллекций
Классы коллекций, такие как класс 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.
Мы создаем класс с именем 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; } }
Результатом вышеупомянутой программы будет —