Шаг 70.
Язык программирования Java.
Ограничение супертипа на подстановки

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

Ограничения на подстановки подобны ограничения на переменные типа. Но у них имеется дополнительная возможность - определить ограничение супертипа следующим образом:

? super Manager

Эта подстановка ограничивается всеми супертипами Manager. Подстановка с ограничением супертипа дает поведение, противоположное тому, что сказано ранее о подстановочных типах. В частности, методам можно передавать параметры, но нельзя использовать возвращаемые ими значения. Например, в классе типа Pair<? super Manager> имеются следующие методы:

void setFirst(? super Manager) {...}
? super Manager getFirst() {...}

Компилятору точно неизвестен тип метода setFirst(), но он может вызвать этот метод с любым объектом типа Manager, Employee или Object, но не такого подтипа, как String. Более того, если вызывается метод getFirst(), то нет никакой гарантии относительно типа возвращаемого объекта. Его можно присвоить только переменной ссылки на объект типа Object.

Рассмотрим следующий пример. Пусть у нас есть массив руководящих работников организации и сведения о минимальном и максимальном размере премии одного из них требуется ввести в объект класса Pair. Следующий метод примет любой подходящий объект типа Pair в качестве своего параметра:

public static void minmaxBonus(Manager[] a, Pair<? super Manager> result) {
    if (a == null || a.length == 0) {
       return;
    }

    Manager min = a[0];
    Manager max = a[0];
    for (int i = 1; i < a.length; i++) {
        if (min.getBonus() > a[i].getBonus()) {
            min = a[i];
        }
        if (max.getBonus() < a[i].getBonus()) {
            max = a[i];
        }
    }

    result.setFirst(min);
    result.setSecond(max);
}

Если рассуждать интуитивно, то подстановки с ограничениями супертипа позволяют записывать данные в обобщенный объект, а подстановки с ограничением подтипа - читать данные из обобщенного объекта.

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

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