java泛型程序设计——类型变量限定 + 泛型代码和虚拟机
生活随笔
收集整理的這篇文章主要介紹了
java泛型程序设计——类型变量限定 + 泛型代码和虚拟机
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README
0.1) 本文描述+源代碼均 轉自 core java volume 1, 旨在理解 java泛型程序設計 的 類型變量限定 + 泛型代碼和虛擬機 的知識;
【1】類型變量的限定
1.1)類和方法需要對類型變量加以限定
- 1.1.1)看個荔枝:
對以上代碼的分析(Analysis):
- A1)出現的問題:變量smallest 的類型為 T ,意味著它可以是任何一個類的對象。怎么才能確定T 所屬的類有 compareTo 方法呢?
- A2)解決方法:將T 限制為 實現了 Comparable 接口(只含有一個compareTo的標準接口)的類。 可以通過對類型變量T設置限定實現這一點:
- 現在, 泛型的main方法只能被實現了 Comparable 接口的類(如 String, Date 等)的數組調用。 由于 Rectangle 類沒有實現 Comparable接口, 所以調用min 方法將會產生一個編譯錯誤;
A3)讀者奇怪: 為什么使用關鍵字extends 而不是 implemens , 因為Comparable是一個接口。
A3.1)看個荔枝: 表示T 應該是綁定類型的子類型。T 和 綁定類型可以是類, 也可以是接口。 選擇關
鍵字extends 的原因是更接近子類的概念, 并且 java 的設計者也不打算在語言中再添加一個新的 關鍵字;
1.2)一個類型變量或通配符可以有多個限定, 如
1.3)在java繼承中, 可以根據需要擁有多個接口超類型, 但限定中至多有一個類。 如果用一個類作為限定, 它必 須是限定列表中的第一個;
1.4)看個荔枝:
【2】泛型代碼和虛擬機
2.1)虛擬機沒有泛型類對象——所有對象都屬于普通類;
- 2.1.1)原始類型:無論何時定義一個泛型類型, 都自動提供了一個相應的 原始類型。 原始類型的名字就是刪去類型參數后的泛型類型名。
- 2.1.2)擦除操作: 擦除類型變量, 并替換為 限定類型(無限定的變量用 Object, 如只有T,沒有 T extends Comparable 的限定類型);
- 2.1.3)看個荔枝: Pair(下圖中的代碼) 的原始類型(下面的源代碼)如下,
對以上代碼的分析(Analysis):
- A1)因為T是一個無限定的變量,所以直接用 Object 替換;
- A2)在程序中可以包含不同類型的 Pair ,如 Pair, Pair , 而擦除類型后就變成原始的Pair 類型了;
2.2)原始類型用第一個限定的類型變量來替換, 如果沒有給定限定就用 Object替換。
- 2.2.1)沒有限定類型: 如上述荔枝中的 Pair 沒有類型變量沒有限定(沒有 T extends … 語句), 因此,原始類型用 Object 替換T;
- 2.2.2)但是如果T有限定的話: 如 T extends Comparable & Serializable , 看個荔枝:
- 原始類型 Interval 如下所示:
Annotation)
- A1)如果切換限定:class Interval 《Serializable & Comparalbe> 會發生什么?
- A2)如果這樣做 : 原始類型用 Serializable 替換T , 而編譯器在必要時要向 Comparable 插入強制類型轉換。
- A3)為了提高效率: 應該將標簽(tagging) 接口(即沒有方法的接口)放在邊界列表的末尾;
總結
以上是生活随笔為你收集整理的java泛型程序设计——类型变量限定 + 泛型代码和虚拟机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos攻击查询(ddos攻击哪里找)
- 下一篇: 安卓电玩游戏(安卓电游戏)