昨天說明為什麼最好優先使用list,看起來list似乎是因為可以使用泛型,享受到泛型的優點,所以才鼓勵優先使用list,那麼array是否也可以使用或混用泛型,享受這些好處呢?
直接用list建立泛型array,但是這樣會遇到compile錯誤,compiler會跳出generic array creation。
import java.util.List;
public class GenericArray {
// 嘗試創建一個 List<String>[] 陣列
List<String>[] listArray = new List<String>[10]; // 這行會編譯錯誤
}
假如還是很堅持這麼做,可以透過把raw type的list array,強制轉型成泛型array。
import java.util.ArrayList;
import java.util.List;
public class GenericArray {
public static void main(String[] args) {
// 如果你設法繞過編譯錯誤(例如使用強制轉型)
List<String>[] listArray = (List<String>[]) new List[10];
// 嘗試將 List<String> 添加到陣列中
listArray[0] = new ArrayList<String>();
listArray[0].add("Hello");
// 嘗試將一個不正確的類型放入陣列中(這樣做是錯誤的)
List<Integer> intList = new ArrayList<>();
intList.add(123);
Object[] objectArray = listArray; // 將 listArray 視為 Object[] 型別
objectArray[1] = intList; // 這行不會拋出錯誤,因為 objectArray 是 Object[]
// 這會導致運行時的 ClassCastException
String s = listArray[1].get(0); // 嘗試取得 listArray[1] 的第一個元素
}
}
結果這個被強加的泛型,仍然保留了array的缺點,型別錯誤時,一樣在runtime的時候才跳出java.lang.ClassCastException,引發潛在的型別安全問題,反而失去了泛型在compile time檢查出型別錯誤的優點。
第一次參加鐵人賽就順利完成30天的挑戰,感謝自己沒有半途而廢QAQ下班就算再累也要看書寫心得,完成鐵人賽的挑戰XDDD 不過這不是終點,effective java還沒有結束,之後會繼續在medium上更新Effective Java Note,歡迎大家來看看XDD另外,之後還會開一場探索亞馬遜雨林30天,還沒正式開始,也歡迎之後大家來捧場XDDD