首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 數組卻變異:為什麼 Person[] 引用 Employer[] 會拋出 ArrayStoreException?

     編輯:程式設計綜合問答

現象描述

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> 等泛型集合(泛型是不變的,編譯期即可發現錯誤)。
  • 若必須用數組,請確保存入元素類型與數組實際組件類型兼容。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved