Подстановочный тип в Java
Параметр типа в объявлении класса фиксирует один конкретный тип на весь объект. В типе аргумента метода иногда нужна большая свобода: важен сам факт списка, а не то, строки там или числа.
Знак вопроса в угловых скобках обозначает
подстановочный тип. Запись List<?> читается
как список чего-то, без обещания конкретного
элемента:
class Printer {
static void printSize(List<?> row) {
System.out.println(row.size());
}
}
void demo() {
Printer.printSize(List.of("a", "b"));
Printer.printSize(List.of(1, 2, 3));
}
Элемент, прочитанный по индексу, имеет тип
Object - общий тип для неизвестного
содержимого. Добавление нового значения в такой
список через параметр List<?> запрещено:
компилятор не знает, какой тип там допустим:
class First {
static Object firstLabel(List<?> row) {
return row.isEmpty() ? null : row.get(0);
}
}
void demo() {
System.out.println(First.firstLabel(List.of("x")));
System.out.println(First.firstLabel(List.of(10)));
}
Подстановочный тип не заменяет параметр типа
T в объявлении своего класса. Его ставят
в сигнатурах, где нужно принять разные
конкретизации одного обобщенного типа.
Напишите метод, который выводит размер любого списка с подстановочным типом. Проверьте на списке из трех символов и выведите число.
Сделайте метод, который возвращает первый
элемент списка с ? или null для
пустого списка. Проверьте на списке чисел
4, 5 и выведите результат.