Символ подстановки для универсального типа. Обычно вы объявляете список массивов следующим образом:
ArrayList<String>
Где тип указан точно. Список будет содержать строки.
Но иногда вы хотите создать метод или класс, который принимает ArrayList любого типа, или вам нужно поле, которое указывает ArrayList любого типа
public void removeFirstItem(ArrayList<?> target) {
...
}
Теперь этот метод может принять ArrayList<String>
или ArrayList<Long>
и т. Д. И выполнить с ним некоторую операцию.
Аналогично вы можете иметь локальную переменную:
ArrayList<?> someList;
someList = new ArrayList<String>();
someList = new ArrayList<Long>);
Это работает, тогда как:
ArrayList<String> someList = new ArrayList<String>();
someList = new ArrayList<Long>();
Не будет, поскольку someList указан как ArrayList<String>
, поэтому ему может быть назначен только ArrayList<String>
.