Давайте объявим массив в Java.

String[] teams = {“CSK”, “MI”};

Давайте объявим еще один массив объектов.

Object[] objects = teams;

Что мы сделали? Копируем команды на объекты. Они разного типа.
Но это нормально, потому что мы приводим подкласс к суперклассу. Мы должны
помнить, что копируя объекты, мы не копируем сами объекты. Мы
по сути копируем ссылку на объект. Это означает, что и объекты, и команды
имеют один и тот же адрес. Если вы меняете команду, изменения также отражаются
на объектах.

В Java каждый массив является объектом. Кроме того, класс Object по умолчанию является родительским
классом для всех классов Java.

Давайте объявим еще один массив String.

String[] teams2 = (String[]) objects;

Теперь копируем объекты в Teams2. Нам нужно указать тип, потому что
мы выполняем приведение из суперкласса в подкласс.

teams2[0] = new StringBuilder();

По сути, мы здесь создаем объект StringBuilder в
первом элементе массива Teams2. Он не скомпилируется, потому что. Мы просто
создаем объект StringBuilder, но он имеет тип String. Но давайте посмотрим другой пример.

objects[0] = new StringBuilder();

Здесь все становится сложнее. Он компилируется. Но это дает исключение ArrayStoreException.
Почему? Потому что помните, что объекты — это не массив объектов. Это строковый массив. Потому что
мы копировали команды на объекты. Оба используют одну и ту же ссылку типа String.
Но мы создаем объект StringBuilder. Он компилируется. Но это вызовет исключение.

Здесь мы писали строку за строкой. В этом примере это очевидно. Но в большой базе кода
где нет таких построчных объявлений.

Дело в том, что будьте осторожны, проводя кастинг людей.
В динамических языках программирования дела обстоят еще хуже.