Рассмотрим следующий код:
class AA { }
class BB extends AA { }
public class Testing {
public static void main(String[] args) {
BB[] arr = new BB[10];
AA[] arr2 = arr;
BB b = new BB();
AA a = new AA();
arr2[0] = a; // ArrayStoreException at runtime
arr2[1] = b;
List<BB> listBB = new ArrayList<>();
List listAA = listBB;
listAA.add("hello world.txt");
}
}
В приведенном выше примере я получаю ArrayStoreException
при попытке arr2[0] = a
. Это означает, что массив запоминает, какой тип он должен принять. Но List
не помнит их. Он просто компилируется и работает нормально. ClassCastException
будет сброшен, когда я извлечу объект BB
.
Итак, вопросы:
-
Как массив запоминает его тип (я знаю, что он называется "reification" ). Как это происходит точно?
-
И почему только массивы снабжаются этой мощью, но не
ArrayList
, хотя он использует массив под капотом. -
Почему во время компиляции не может быть обнаружено
ArrayStoreException
, т.е. когда я делаюarr2[0] = a
, это может вызвать ошибку компилятора, а не обнаруживать его во время выполнения.
Спасибо.