Зачем в «ArrayList» нужно писать «?»​

Если дословно, не вдаваясь в термины дженериков, то данную конструкцию можно описать как 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);
    }
}

Если раскомментировать лист строк, то пример не скомпилируется. Гораздо лучше отловить ошибку компилятором, нежели она всплывёт в момент выполнения программы.

Понравилась статья? Поделиться с друзьями:

Комментарии:

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: