Я обновляю свои знания о дженериках Java. Поэтому я обратился к превосходному учебнику от Oracle... и начал собирать презентацию для моих коллег. Я наткнулся на раздел на подстановочные знаки в tutorial, в котором говорится:
Рассмотрим следующий метод: printList:
public static void printList(List<Object> list) { ...
Цель printList - распечатать список любого типа, но он не достигает этой цели - он печатает только список экземпляров Object; он не может печатать
List<Integer>
,List<String>
,List<Double>
и т.д., потому что они не являются подтипамиList<Object>
. Чтобы написать общий метод printList, используйтеList<?>
:public static void printList(List<?> list) {
Я понимаю, что List<Object>
не будет работать; но я изменил код на
static <E> void printObjects(List<E> list) {
for (E e : list) {
System.out.println(e.toString());
}
}
...
List<Object> objects = Arrays.<Object>asList("1", "two");
printObjects(objects);
List<Integer> integers = Arrays.asList(3, 4);
printObjects(integers);
И угадайте, что; используя List<E>
Я могу печатать различные типы списков без каких-либо проблем.
Короче говоря: по крайней мере, в учебном пособии указано, что одному нужен шаблон для решения этой проблемы; но, как показано, это также можно решить таким образом. Итак, что мне не хватает?!
(сторона примечания: протестировано с Java7, так что, возможно, это была проблема с Java5, Java6, но, с другой стороны, Oracle, похоже, хорошо справляется с обновлениями своих учебников)