Параметр типа
Параметр типа <T> - это специальный идентификатор,
который позволяет создавать обобщённые (generic) классы,
методы и интерфейсы. Вместо конкретного типа, например
String или Integer, в объявлении
используется условная буква. Чаще всего это буква T
(от английского Type), но можно использовать любую другую,
например E для элементов коллекции, K и V
для ключа и значения в словарях. Конкретный тип подставляется
в момент создания объекта или вызова метода. Это позволяет
писать один универсальный код для работы с разными типами
данных и при этом сохранять строгую проверку типов на этапе
компиляции.
Синтаксис
Параметр типа объявляется в угловых скобках после имени класса, интерфейса или метода:
class ClassName<T>
{
// тело класса
}
Для методов параметр типа указывается перед возвращаемым типом:
public <T> T methodName(T value)
{
return value;
}
Пример
Давайте создадим обобщённый класс Box, который
хранит значение любого типа, и подставим вместо T
тип String:
public class Main
{
public static void main(String[] args)
{
Box<String> box = new Box<>();
box.setValue("abcde");
System.out.println(box.getValue());
}
}
class Box<T>
{
private T value;
public void setValue(T value)
{
this.value = value;
}
public T getValue()
{
return value;
}
}
Результат выполнения кода:
"abcde"
Пример
Теперь подставим вместо T тип Integer:
public class Main
{
public static void main(String[] args)
{
Box<Integer> box = new Box<>();
box.setValue(12345);
System.out.println(box.getValue());
}
}
class Box<T>
{
private T value;
public void setValue(T value)
{
this.value = value;
}
public T getValue()
{
return value;
}
}
Результат выполнения кода:
12345
Пример
Параметр типа можно использовать и в обобщённых методах. Давайте напишем метод, который возвращает первый элемент списка:
import java.util.List;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("a", "b", "c", "d", "e");
System.out.println(getFirst(list));
}
public static <T> T getFirst(List<T> list)
{
return list.get(0);
}
}
Результат выполнения кода:
"a"
Смотрите также
-
обобщённые методы
generic-method,
которые используют параметры типа -
обобщённые конструкторы
generic-ctor,
которые принимают параметры типа -
алмазный оператор
diamond,
который позволяет не указывать тип справа -
ограничение типа
extends-bound,
которое сужает допустимые типы