日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java泛型程序设计——类型变量限定 + 泛型代码和虚拟机

發布時間:2023/12/3 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java泛型程序设计——类型变量限定 + 泛型代码和虚拟机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【0】README

0.1) 本文描述+源代碼均 轉自 core java volume 1, 旨在理解 java泛型程序設計 的 類型變量限定 + 泛型代碼和虛擬機 的知識;


【1】類型變量的限定

1.1)類和方法需要對類型變量加以限定

  • 1.1.1)看個荔枝:
class ArrayAlg {public static <T> T min(T[] a){if(a == null || a.length==0) return null;T smallest = a[0];for(int i=1;i<a.length;i++)if(smallest.compareTo(a[i]) > 0) smallest = a[i];return smallest;} }

對以上代碼的分析(Analysis):

  • A1)出現的問題:變量smallest 的類型為 T ,意味著它可以是任何一個類的對象。怎么才能確定T 所屬的類有 compareTo 方法呢?
  • A2)解決方法:將T 限制為 實現了 Comparable 接口(只含有一個compareTo的標準接口)的類。 可以通過對類型變量T設置限定實現這一點:
public staitc <T extends Comparable> T min(T[] a);
  • 現在, 泛型的main方法只能被實現了 Comparable 接口的類(如 String, Date 等)的數組調用。 由于 Rectangle 類沒有實現 Comparable接口, 所以調用min 方法將會產生一個編譯錯誤;

A3)讀者奇怪: 為什么使用關鍵字extends 而不是 implemens , 因為Comparable是一個接口。
A3.1)看個荔枝: 表示T 應該是綁定類型的子類型。T 和 綁定類型可以是類, 也可以是接口。 選擇關
鍵字extends 的原因是更接近子類的概念, 并且 java 的設計者也不打算在語言中再添加一個新的 關鍵字;
1.2)一個類型變量或通配符可以有多個限定, 如

T extends Comparable & Serializable 限定類型用 & 分割, 而逗號用來分割類型變量;

1.3)在java繼承中, 可以根據需要擁有多個接口超類型, 但限定中至多有一個類。 如果用一個類作為限定, 它必 須是限定列表中的第一個;
1.4)看個荔枝:


【2】泛型代碼和虛擬機

2.1)虛擬機沒有泛型類對象——所有對象都屬于普通類;

  • 2.1.1)原始類型:無論何時定義一個泛型類型, 都自動提供了一個相應的 原始類型。 原始類型的名字就是刪去類型參數后的泛型類型名。
  • 2.1.2)擦除操作: 擦除類型變量, 并替換為 限定類型(無限定的變量用 Object, 如只有T,沒有 T extends Comparable 的限定類型);
  • 2.1.3)看個荔枝: Pair(下圖中的代碼) 的原始類型(下面的源代碼)如下,
public class Pair {private Object first;private Object second;public Pair() { first = null; second = null; }public Pair(Object first, Object second) { this.first = first; this.second = second; }public Object getFirst() { return first; }public Object getSecond() { return second; }public void setFirst(Object newValue) { first = newValue; }public void setSecond(Object newValue) { second = newValue; } }

對以上代碼的分析(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 , 看個荔枝:
public class Interval<T extends Comparable & Serializable> implements Serializable {private T lower;private T upper;public Interval(T first, T second){} }
  • 原始類型 Interval 如下所示:
public class Interval implements Serializable {private Comparable lower;private Comparable upper;public Interval(Comparable first, Comparable second){} }

Annotation)

  • A1)如果切換限定:class Interval 《Serializable & Comparalbe> 會發生什么?
  • A2)如果這樣做 : 原始類型用 Serializable 替換T , 而編譯器在必要時要向 Comparable 插入強制類型轉換。
  • A3)為了提高效率: 應該將標簽(tagging) 接口(即沒有方法的接口)放在邊界列表的末尾;

總結

以上是生活随笔為你收集整理的java泛型程序设计——类型变量限定 + 泛型代码和虚拟机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。