Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: (Обновленные) Обобщения
Раздел: Подстановочные знаки
Верхние Ограниченные Подстановочные знаки
Домашняя страница > Изучение Языка Java > (Обновленные) обобщения

Верхние Ограниченные Подстановочные знаки

Можно использовать верхний ограниченный подстановочный знак, чтобы ослабить ограничения на переменную. Например, скажите, что Вы хотите записать метод, который работает над List<Integer>, List<Double>, и List<Number>; можно достигнуть этого при использовании верхнего ограниченного подстановочного знака.

Чтобы объявить верхне ограниченный подстановочный знак, используйте подстановочный символ ('?'), сопровождаемый ключевым словом extends, сопровождаемым его верхней границей. Отметьте, что в этом контексте extends используется в общем смысле означать, что любой "расширяется" (как в классах) или "реализации" (как в интерфейсах).

Чтобы записать метод, который работает над списками Number и подтипами Number, такими как Integer, Double, и Float, Вы определили бы List<? extends Number>. Термин List<Number> является более рестриктивным чем List<? extends Number> потому что прежние соответствия список типа Number только, тогда как последние соответствия список типа Number или любой из его подклассов.

Рассмотрите следующий метод process:

public static void process(List<? extends Foo> list) { /* ... */ }

Верхний ограниченный подстановочный знак, <? extends Foo>, где Foo является любым типом, соответствует Foo и любой подтип Foo. Метод process может получить доступ к элементам списка как к типу Foo:

public static void process(List<? extends Foo> list) {
    for (Foo elem : list) {
        // ...
    }
}

В пункте foreach переменная elem выполняет итерации по каждому элементу в списке. Любой метод, определенный в Foo class, может теперь использоваться на elem.

Метод sumOfList возвращает сумму чисел в списке:

public static double sumOfList(List<? extends Number> list) {
    double s = 0.0;
    for (Number n : list)
        s += n.doubleValue();
    return s;
}

Следующий код, используя список объектов Integer, печатает sum = 6.0:

List<Integer> li = Arrays.asList(1, 2, 3);
System.out.println("sum = " + sumOfList(li));

Список значений Double может использовать тот же самый метод sumOfList. Следующий код печатает sum = 7.0:

List<Double> ld = Arrays.asList(1.2, 2.3, 3.5);
System.out.println("sum = " + sumOfList(ld));

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Подстановочные знаки
Следующая страница: Неограниченные Подстановочные знаки