Animal[] objAnimal = {new Cat()};
- это ярлык для
Animal[] objAnimal = new Animal[] {new Cat()};
, который является ярлыком для
Animal[] objAnimal = new Animal[1];
objAnimal[0] = new Cat();
Скомпилированный код идентичен.Итак, при рассмотрении последнего варианта должно стать очевидным, что вы можете выполнить
Cat objCat0 = (Cat)objAnimal[0];
, поскольку ранее вы сохранили ссылку на экземпляр Cat
, созданный с помощью new Cat()
, на objAnimal[0]
, тогда как
Cat[] objCatArray = (Cat[]) objAnimal;
недопустим, поскольку objAnimal
содержит ссылку на экземпляр массива Animal[]
, созданный с помощью new Animal[1]
.Тот факт, что в одном элементе хранится ссылка Cat
, не меняет тип массива.В любой момент может быть последующий objAnimal[0] = new Animal();
.
Используемый в вашем вопросе синтаксис инициализатора массива существует для удобства, но не меняет логику.Таким образом,
Animal[] objAnimal = {new Cat()};
objAnimal[0] = new Animal();
действителен и
Cat[] objCatArray = (Cat[]) objAnimal;
должен потерпеть неудачу, так как в противном случае вы могли бы впоследствии использовать
Cat cat = objCatArray[0];
без приведения, несмотря на возможность objAnimal[0] = new Animal()
назначение.