本文探討Java泛型中創(chuàng)建參數(shù)化類型數(shù)組的限制,以及由此引發(fā)的運(yùn)行時(shí)類型錯(cuò)誤。Java泛型的類型擦除機(jī)制是問題的核心。運(yùn)行時(shí),泛型類型信息丟失,只保留原始類型,這導(dǎo)致了看似合理的代碼在運(yùn)行時(shí)拋出異常。
讓我們來看一個(gè)例子:
private static class Pair<T> { public T t; public Pair(T t) { this.t = t; } } public static void main(String[] args) { Pair<String>[] stringPairs = new Pair[10]; // 嘗試創(chuàng)建Pair<String>數(shù)組 Object[] objPairs = stringPairs; // 將泛型數(shù)組賦值給Object數(shù)組 // 以下語句會(huì)拋出ArrayStoreException,因?yàn)閿?shù)組元素類型實(shí)際為Pair<String>,而非String // objPairs[0] = "123"; // 以下語句不會(huì)在賦值時(shí)報(bào)錯(cuò),因?yàn)轭愋筒脸螅瑪?shù)組元素類型都是Pair objPairs[0] = new Pair<>(1); // 以下語句會(huì)拋出ClassCastException,因?yàn)閷?shí)際存儲(chǔ)的是Pair<Integer>對象 Pair<String> stringPair = stringPairs[0]; }
代碼試圖創(chuàng)建一個(gè)Pair
嘗試將字符串”123″賦值給objPairs[0]會(huì)拋出ArrayStoreException,因?yàn)閿?shù)組元素的實(shí)際類型仍然是Pair
立即學(xué)習(xí)“Java免費(fèi)學(xué)習(xí)筆記(深入)”;
因此,Java不允許創(chuàng)建參數(shù)化類型的數(shù)組,因?yàn)榫幾g器無法在運(yùn)行時(shí)驗(yàn)證數(shù)組元素的類型。 這正是書中提到的“類型錯(cuò)誤”的根本原因:類型擦除導(dǎo)致的運(yùn)行時(shí)類型不匹配,從而引發(fā)ArrayStoreException或ClassCastException。 即使編譯通過,運(yùn)行時(shí)也可能出現(xiàn)異常。 解決方法通常是使用List