Java泛型中<?> 和 <? extends Object>的異同分析
阿新 • • 發佈:2020-11-18
相信很多人和我一樣,接觸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