Если дословно, не вдаваясь в термины дженериков, то данную конструкцию можно описать как ArrayList каких то типов, которые станут известны только в момент выполнения программы. «?» является так называемым групповым типом(маской), он не позволяет вызывать методы, модифицирующие дженеризированный объект. Но можно расширять маску и тогда методы становятся доступны. Пример в коде ниже:
class ListPrinter { static void printList(List<? extends Number> list){ Class c = list.getClass(); for(Number n:list){ System.out.print(n + " "); } System.out.println(); } } public class TestMask{ public static void main(String[] args) { ArrayList<Double> listD = new ArrayList<>(Arrays.asList(new Double(3.14),new Double(99.54),new Double(5d))); ArrayList<Integer> listI = new ArrayList<>(Arrays.asList(new Integer(3),new Integer(99),new Integer(5))); ArrayList<Float> listF = new ArrayList<>(Arrays.asList(new Float(3.14f),new Float(99f),new Float(5f))); ArrayList<String> listS = new ArrayList<>(Arrays.asList("first","second")); ListPrinter.printList(listD); ListPrinter.printList(listF); ListPrinter.printList(listI); // ListPrinter.printList(listS); } }
Если раскомментировать лист строк, то пример не скомпилируется. Гораздо лучше отловить ошибку компилятором, нежели она всплывёт в момент выполнения программы.
Комментарии: