Employer[] emprs = { new Employer("張三"), new Employer("李四") };
Person[] ps = emprs; // 向上轉型,合法
ps[0] = new Person("小明"); // 運行時拋出 ArrayStoreException
Java 數組具有協變性:Employer[] 是 Person[] 的子類型,因此賦值合法。但數組在運行時會記錄其實際組件類型(此處為 Employer)。當向 ps[0] 存入 Person 實例時,JVM 檢測到實際數組只能存放 Employer 或其子類,而 Person 是父類,違反類型安全,故拋出 ArrayStoreException。
emprs 和 ps 指向同一塊堆內存。emprs 承諾裡面全是 Employer。若允許通過 ps 放入 Person,則通過 emprs[0].setBonus() 就會在父類對象上調用子類方法,導致崩潰。為防止此類錯誤,JVM 在存入時做動態類型檢查。
List<Person> 等泛型集合(泛型是不變的,編譯期即可發現錯誤)。