1. 程式人生 > >Java泛型中<?> 和 <? extends Object>的異同分析

Java泛型中<?> 和 <? extends Object>的異同分析

相信很多人和我一樣,接觸Java多年,卻仍舊搞不清楚 `Java` 泛型中 ``和 ``的相似和不同。但是,這應該是一個比較高階大氣上檔次的Question, 在我們進行深入的探討之前,有必要對Java泛型有一個基礎的瞭解。詳細請看上一篇文章! [重溫Java泛型,帶你更深入地理解它,更好的使用它!](https://mp.weixin.qq.com/s/wOnkv-sLJ2hWdbD9JyqNfw) ## 1. 泛型產生的背景 在 JDK5 中引入了泛型來消除編譯時錯誤和加強型別安全性。這種額外的型別安全性消除了某些用例中的強制轉換,並使程式設計師能夠編寫泛型演算法,這兩種方法都可以生成更具可讀性的程式碼。 例如,在 JDK5 之前,我們必須使用強制轉換來處理列表的元素。這反過來又產生了一類特定的執行時錯誤: ```java List aList = new ArrayList(); aList.add(new Integer(1)); aList.add("a_string"); for (int i = 0; i < aList.size(); i++) { Integer x = (Integer) aList.get(i); } ``` 現在,我們想解決兩個問題: - 我們需要一個顯式轉換來從 `aList` 中提取值——型別取決於左側的變數型別(在本例中為*Integer*) - 當我們試圖將 `a_string` 轉換為 `Integer` 時,在第二次迭代中會出現執行時錯誤。 泛型填補了這個空白,程式碼如下: ```j