Java 泛型中易混淆的地方

散拾兄發表於2018-11-26

參考文章

萬用字元 ? 是針對引數而言的。

  • 對於 List<? super Integer> l1:

    • 正確的理解:? super Integer 限定的是泛型引數. 令 l1 的泛型引數是 T, 則 T 是 Integer 或 Integer 的父類, 因此 Integer 或 Integer 的子類的物件就可以新增到 l1 中.

    • 錯誤的理解: ? super Integer限定的是插入的元素的型別, 因此只要是 Integer 或 Integer 的父類的物件都可以插入 l1 中

  • 對於 List<? extends Integer> l2:

    • 正確的理解:? extends Integer 限定的是泛型引數. 令 l2 的泛型引數是 T, 則 T 是 Integer 或 Integer 的子類, 進而我們就不能找到一個類 X, 使得 X 是泛型引數 T 的子類, 因此我們就不可以向 l2 中新增元素. 不過由於我們知道了泛型引數 T 是 Integer 或 Integer 的子類這一點, 因此我們就可以從 l2 中讀取到元素(取到的元素型別是 Integer 或 Integer 的子類), 並可以存放到 Integer 中.

    • 錯誤的理解: ? extends Integer 限定的是插入元素的型別, 因此只要是 Integer 或 Integer 的子類的物件都可以插入 l2 中

相關文章