Generic-конструктор
Generic-конструктор - это конструктор, который объявляет
собственные параметры типа. Такие параметры типа указываются
в угловых скобках перед именем конструктора и действуют
только внутри этого конструктора. Это позволяет создавать
объекты с разными типами данных, даже если сам класс
не является обобщенным. В угловых скобках мы указываем
один или несколько параметров типа, например T
или T, U.
Важно понимать, что параметры типа generic-конструктора
независимы от параметров типа класса. Даже если класс
объявлен как class Box<T>, конструктор может
объявить свой собственный параметр типа, например
<U> Box(U value).
Синтаксис
class ClassName
{
<T> ClassName(T value)
{
// тело конструктора
}
}
Пример
Давайте создадим класс Box с generic-конструктором,
который принимает значение любого типа и сохраняет его
в виде строки:
public class Main
{
public static void main(String[] args)
{
Box box1 = new Box(12345);
Box box2 = new Box("abcde");
System.out.println(box1.getValue());
System.out.println(box2.getValue());
}
}
class Box
{
private String value;
public <T> Box(T value)
{
this.value = value.toString();
}
public String getValue()
{
return value;
}
}
Результат выполнения кода:
"12345"
"abcde"
Пример
Давайте создадим обобщенный класс Pair с двумя
параметрами типа и generic-конструктором, который
принимает значения других типов:
public class Main
{
public static void main(String[] args)
{
Pair<Integer, String> pair = new Pair<>(1, "abcde");
System.out.println(pair.getFirst());
System.out.println(pair.getSecond());
}
}
class Pair<K, V>
{
private K first;
private V second;
public <A, B> Pair(A first, B second)
{
this.first = (K) first;
this.second = (V) second;
}
public K getFirst()
{
return first;
}
public V getSecond()
{
return second;
}
}
Результат выполнения кода:
1
"abcde"
Пример
Давайте создадим класс Wrapper с generic-конструктором,
который принимает список элементов любого типа и выводит
их количество:
import java.util.List;
public class Main
{
public static void main(String[] args)
{
Wrapper wrapper = new Wrapper(List.of(1, 2, 3, 4, 5));
System.out.println(wrapper.getSize());
}
}
class Wrapper
{
private int size;
public <T> Wrapper(List<T> list)
{
this.size = list.size();
}
public int getSize()
{
return size;
}
}
Результат выполнения кода:
5
Смотрите также
-
параметр типа
type-param,
который объявляется в угловых скобках -
обобщенный метод
generic-method,
который объявляет собственные параметры типа -
обобщенный класс
class,
который использует параметры типа -
алмазный оператор
diamond,
который позволяет опустить тип при создании объекта