Spec-Zone .ru
спецификации, руководства, описания, API
|
Можно использовать верхний ограниченный подстановочный знак, чтобы ослабить ограничения на переменную. Например, скажите, что Вы хотите записать метод, который работает над 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));