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

【Java 每日一題】20170112:陣列共變與泛型不變的編譯陷阱

     編輯:Java 綜合教學

【Java 每日一題】20170112:陣列共變與泛型不變的編譯陷阱

題目程式碼

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
    }
}

問題

請問主程式能否正常編譯通過?

解析

第 1 行:Number[] numbers = new Integer[10]; ✅ 編譯通過

Java 陣列具有共變性:Integer 是 Number 的子類,因此 Integer[] 可賦值給 Number[]。但執行期若存入非 Integer 的 Number 子類(如 Double),會拋出 ArrayStoreException。

第 2 行: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 或訪問簡書專輯。團隊已入駐分答,歡迎提問交流。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved