Что такое типобезопасность при работе с массивами в Java?

«Что такое типобезопасность при работе с массивами в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Типобезопасность (type safety) при работе с массивами в Java означает, что компилятор и среда выполнения (JVM) гарантируют, что в массив можно поместить только элементы его объявленного типа (или подтипа). Попытка сохранить объект несовместимого типа приводит к ошибке ArrayStoreException во время выполнения.

Как это работает:

  1. Проверка при компиляции: Компилятор предотвращает очевидные ошибки.

    String[] strArray = new String[10];
    strArray[0] = "Hello"; // OK
    strArray[1] = 42;       // Ошибка компиляции: несовместимые типы
  2. Проверка во время выполнения (Runtime): Для случаев с ковариантностью массивов.

    Object[] objArray = new String[5]; // Ковариантность: String[] является Object[]
    objArray[0] = "test"; // OK, String совместим с String[]
    objArray[1] = new Integer(100); // Выбросит ArrayStoreException во время выполнения!
    // JVM проверяет, что фактический тип массива (String[]) может хранить Integer.

Почему это важно:

  • Надёжность: Предотвращает случайную порчу данных в массиве объектами неправильного типа.
  • Предсказуемость: Избегает ошибок, которые сложно отладить.
  • Отличие от generics: Массивы обеспечивают типобезопасность во время выполнения (reified), а generics (как ArrayList<T>) — только на этапе компиляции (type erasure).