Person[] arr = new Employee[ 5 ]; // compiles: arrays are compatible
arr[ 0 ] = new Student( ... ); // compiles: Student IS-A Person
이것의 문제점은 Student는 Employee와 compatible 하지 않다는 거. 왜냐면 Student IS-A Employee는 거짓이기 때문. 근데 casting은 없었으므로 ClassCastException을 던질 수도 없다.
→ 아니 그러면 Object의 경우에도 저렇게 하면 안되나 싶었는데, 직접 코드를 짜보니 Object의 경우 저렇게 못 짬. Array일 경우에만 저렇게 짤 수가 있음. Array 전체는 →Employee인데 그 중에 개별 element가 →Student가 되는 것. Object는 딱 하나이므로 지 혼자 이것저것 변해도 상관이 없음. 근데 Array는 element의 모임이기에 하나의 element가 지 혼자 변해버리면 문제가 생기는 것임.
→ 아니 그러면 Student[] arr new [5] 이런 식으로 한 다음에 arr[0] = new Student 이러면 되지않나? 안되겠지. 메모리 잡아먹는 게 다 다를 수 있으니깐.
→ 따라서 ArrayStoreException이라는 게 있고, 이것은 그 chile type의 Array의 element들은 그 child type임만을 허락함. upcasting의 대상인 parent type도 들어가서는 안됨.