Ковариантность позволяет работать с массивом по типу массива родителей. Например, через приведение к
Object[]
можно попытаться положить любой объект в любой массив:
Object x[] = new String[3];
x[0] = new Integer(0);
Компилятор гарантирует, что когда вы берете элемент из массива, он будет представителем типа элементов самого этого массива. Не важно какого типа переменная его хранит. Именно для обеспечения этой гарантии работает проверка типа времени выполнения, которая и выбрасывает
ArrayStoreException
.Ситуация похожа на проблему heap pollution в случае дженериков. Только для этого случая такая проблема возникает реже, потому что работает проверка этапа компиляции:
// Ошибка компиляции – дженерики инвариантны!
List<Object> x = new ArrayList<String>();