Шаг 72.
Язык программирования Java.
Захват подстановок

На этом шаге мы поговорим про захват подстановок

Рассмотрим следующий метод, меняющий местами составные элементы пары:

public static void swap(Pair<?> p) {...}

Подстановка не является переменной типа, поэтому знак ? нельзя указывать вместо типа. Иными словами, следующий код не скомпилируется:

public static void swap(Pair<?> p) {
    ? t = p.getFirst();
    p.setFirst(p.getSecond());
    p.setSecond(t);
}

В связи с этим возникает затруднение, поскольку при перестановке нужно временно запоминать первый составной элемент пары. Для решения данной проблемы можно воспользоваться следующим способом - написать вспомогательный метод, как это написано ниже:

public static <T> void swapHelper(Pair<T> p) {
    T t = p.getFirts();
    p.setFirst(p.getSecond());
    p.setSecond(t);
}

Тогда метод swap() выглядит следующим образом:

public static void swap(Pair<?> p) {
    swapHelper(p);
}

В данном случае параметр обобщенного типа T захватывает подстановку во вспомогательном методе swapHelper(). Неизвестно, какой именно тип обозначает подстановка, но это совершенно определенный тип. Поэтому определение <T>swapHelper() имеет конкретный смысл, когда обобщение T обозначает этот тип.

Ниже приведем пример использования подстановочных типов.

Проект можно взять здесь

На следующем шаге мы начнем говорить про коллекции

Предыдущий шаг Содержание Следующий шаг