package Jan2017;
import java.util.ArrayList;
import java.util.List;
public class Ques0112 {
public static void main(String[] args) {
Number[] numbers = new Integer[10]; // 1
List<Number> list = new ArrayList<Integer>(); // 2
}
}
請問主程式能否正常編譯通過?
Number[] numbers = new Integer[10]; ✅ 編譯通過Java 陣列具有共變性:Integer 是 Number 的子類,因此 Integer[] 可賦值給 Number[]。但執行期若存入非 Integer 的 Number 子類(如 Double),會拋出 ArrayStoreException。
List<Number> list = new ArrayList<Integer>(); ❌ 編譯失敗泛型在 Java 中是不變的。List<Integer> 不是 List<Number> 的子型別,無法直接賦值。若允許此賦值,透過 list.add(new Double(1.0)) 即可破壞型別安全。正確寫法:
List<Number> list = new ArrayList<Number>();List<? extends Number> list = new ArrayList<Integer>();(但無法透過 list 新增元素)| 特性 | 陣列 | 泛型 |
|---|---|---|
| 型別關係 | 共變 | 不變 |
| 型別檢查 | 執行期 | 編譯期(型別擦除後) |
| 安全性 | 需靠執行期檢查 | 編譯期保證 |
更多每日一題解析請關注公眾號 weknow619 或訪問簡書專輯。團隊已入駐分答,歡迎提問交流。