Spec-Zone .ru
спецификации, руководства, описания, API
|
Неограниченный подстановочный тип определяется, используя подстановочный символ (?), например, List<?>. Это вызывают списком неизвестного типа. Есть два сценария, где неограниченный подстановочный знак является полезным подходом:
Рассмотрите следующий метод, printList:
public static void printList(List<Object> list) { for (Object elem : list) System.out.println(elem + " "); System.out.println(); }
Цель printList состоит в том, чтобы напечатать список любого типа, но это не в состоянии достигнуть той цели — это печатает только список экземпляров Object; это не может напечатать List<Integer>, List<String>, List<Double>, и так далее, потому что они не подтипы List<Object>. Чтобы записать универсальный метод printList, используйте List<?>:
public static void printList(List<?> list) { for (Object elem: list) System.out.print(elem + " "); System.out.println(); }
Поскольку для любого конкретного типа A, List<A> является подтипом List<?>, можно использовать printList, чтобы напечатать список любого типа:
List<Integer> li = Arrays.asList(1, 2, 3); List<String> ls = Arrays.asList("one", "two", "three"); printList(li); printList(ls);
Важно отметить, что List<Object> и List<?> не являются тем же самым. Можно вставить Object, или любой подтип Object, в List<Object>. Но можно только вставить null в List<?>. У