精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 泛型編程所說的類型擦除到底是什么?

開發 前端
正是類型擦除的機制幫助 Java 實現了泛型編程,讓我們作為開發者能夠更好的了解和控制我們正在使用類型的是什么,而不是 Object 滿天飛。

大部分語言都支持泛型,泛型是一種語言機制,各種語言的實現機制都不太一樣,例如C++使用模板方式來實現泛型,而 Java 中用類型擦除機制來實現泛型。

什么是泛型

在 Java 中,不會泛型,寸步難行。泛型可能是一個 Java 初學者需要攻克的第一個難點。隨便跟著一門教程或 任何一本《Java入門到精通》,前面關于變量、關鍵字、語法(if、while、for等等)這些基本上是一看就懂,而當內容來到泛型的時候,大部分人可能就突然感覺沒那么輕松了。

如果沒有編程經驗的話,可能需要練習一段時間才能完全掌握泛型編程概念和技巧,這么說吧,有些人寫了好幾年代碼,碰到泛型的時候可能還是不太熟練。

說到Java泛型,最明顯的標志就是 <> 。

泛型是什么呢?通俗的說就是一個類型是沒有固定類型的,即可以是Integer 也可以是 Long,還可能是你自定義的類。

泛型使類型(類和接口)能夠在定義類、接口和方法時成為參數。與方法聲明中使用的更熟悉的形式參數非常相似,類型參數為您提供了一種通過不同輸入重復使用相同代碼的方法。區別在于形式參數的輸入是值,而類型參數的輸入是類型。

例如在類定義中使用泛型,最常見的 ArrayList

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
//... code
}

例如在方法參數中使用泛型,來一個復雜的例子

public static <T extends Number & Comparable<T>, U extends List<T>, R extends T> R complexMethod(U list, T element) {

}

在這個例子中,有兩個傳入參數 U list, T element,而這兩個參數需要在方法的返回類型前用<>做出說明,也就是 <T extends Number & Comparable<T>, U extends List<T>, R extends T>這一部分。

返回值也是一個泛型 R。

為什么是 T、U、R

經常看到泛型類型用 T、U、R,還有K、V 這樣的符號表示。我們肯定知道不用T也完全沒問題,用 X 也可以。

之所以這么統一是因為這是官方比較推薦的寫法,推薦的規則如下:

  • E - 表示一個元素,例如集合元素、數組元素
  • K - 表示一個 Key,鍵值對經常用到,與之對應的是 V
  • V - 表示一個 Value,鍵值對經常用
  • N - 表示 Number(數字類型)
  • T - 這個見得最多,表示一個類型 Type,不管是基礎類型還是自定義的類

泛型的作用

前面也說了,當一個參數預期可能有多種類型的時候,就會用到泛型,那既然是類型不確定,那直接用 Object 不就行了嗎,何必費事兒呢?一會兒講到類型擦除的時候會發現,本身類型擦除的核心就是把泛型類型轉為 Object。但是這是編譯器干的,為了給JVM看的。而作為開發者和編譯器,使用泛型還是有很大好處的。

1、在編譯時提供更嚴格的類型檢查,如果代碼違反類型安全,編譯器可以及時發現,而不是等到運行的時候拋出運行時異常。

2、使程序員能夠實現通用算法。通過使用泛型,程序員可以實現適用于不同類型集合的泛型算法,可以自定義,并且類型安全且更易于閱讀。

例如下面這個方法,只接受Number 類型的參數,用來比較兩數的大小。

public static <T extends Number> Boolean compare(T first, T second) {
        double firstValue = first.doubleValue();
        double secondValue = second.doubleValue();

        return firstValue > secondValue;
    }

3、消除不必要的類型轉換。

例如下面不用泛型的情況,每次取數據的時候都要轉換一下類型。

List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0);

而用了泛型后,就不用自己轉換了。

List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);

類型擦除

Java 中的泛型實現可以說就是用的類型擦除原理。通俗一點說,類型只在編譯期存在,在運行時就不在了,都變為了 Object,一視同仁。

在我們寫好代碼進行編譯時,編譯器會將泛型參數的類型進行替換,大部分情況下會將類型替換為 0bject 類型。這種行為模式用類型擦除來描述就非常形象。

類型擦除原理

在類型擦除過程中,Java 編譯器會擦除所有類型參數,如果類型參數有界,則用其第一個邊界替換每個參數;如果類型參數無界,則用 Object 替換。

在類型擦除過程中,編譯器會按照以下規則來處理泛型類型參數:

如果類型參數有界(bounded type),即使用了extends關鍵字限定了類型的上界,例如<T extends Number>,則編譯器會用該類型的第一個邊界來替換類型參數。

例如下面這個例子,泛型 T 繼承了Number類型,又實現了 Displayable 接口(沒錯,泛型可以這樣定義)

interface Displayable {
    void display();
}

public class Result<T extends Number & Displayable> {
    private T value;

    public Result(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
    
 public void show() {
        value.display();
    }
}

在編譯器進行類型擦除后會變成下面這樣,因為 T 的上限是 Number,所以直接將 T 替換為 Number。

public class Result {
    private Number value;

    public Result(Number value) {
        this.value = value;
    }

    public Number getValue() {
        return value;
    }
}

如果類型參數無界(unbounded type),即沒有限定類型的上界,例如<T>,則編譯器會用Object類型來替換類型參數。

例如下面方法,沒有指定類型上限類型。

public static <T> int count(T[] anArray, T elem) {
    int cnt = 0;
    for (T e : anArray)
        if (e.equals(elem))
            ++cnt;
        return cnt;
}

經過編譯器的擦除處理后,就變成下面這樣,都替換成了 Object。

public static int count(Object[] anArray, Object elem) {
    int cnt = 0;
    for (Object e : anArray)
        if (e.equals(elem))
            ++cnt;
        return cnt;
}

橋接方法

來看一下下面這段代碼

public class Node<T> {

    public T data;

    public Node(T data) { this.data = data; }

    public void setData(T data) {
        this.data = data;
    }
}

public class SubNode extends Node<Integer> {
    public SubNode(Integer data) { super(data); }

    public void setData(Integer data) {
        super.setData(data);
    }
    
 public static void main(String[] args) {
        SubNode subNode = new SubNode(8);
        Node node = subNode;
        node.setData("Hello");
        Integer x = subNode.data;
    }

}

這段代碼大家一看就知道肯定是有問題的,運行的時候會出現 ClassCastException,但是編譯是可以通過的。

而運行時出現錯誤的代碼是 node.setData("Hello");這一行,但是經過前面對類型擦除的了解,Node 類的 setData 參數肯定被擦除成了 Object 類型了,既然是 Object,那Integer 和 String 都滿足啊,為啥還會報錯呢。

這就要說到橋接了。

當編譯器對泛型擴展的類或接口進行編譯處理的時候,會根據實際的類型進行方法的橋接處理。什么意思呢,還是拿上面的 Node 和 SubNode 類說明。

類型擦除后的代碼是下面這樣的,多了一個橋接方法。

public class Node {

    public Object data;

    public Node(Object data) { this.data = data; }

    public void setData(Object data) {
        this.data = data;
    }
}

public class SubNode extends Node {

    public SubNode(Integer data) { super(data); }

 /**
 ** 橋接方法
 **/
 public void setData(Object data) {
        setData((Integer) data);
    }

    public void setData(Integer data) {
        super.setData(data);
    }
}

為什么需要這個橋接方法呢?

Node 類的 setData 方法入參是 Object 類型。

public void setData(Object data) {
    this.data = data;
}

而 SubNode 的setData 方法入參是 Integer。

public void setData(Integer data) {
 super.setData(data);
}

所以,SubNode 的 setData 方法并不會重寫父類 Node 的setData 方法,而想要重寫的話,就必須讓 SubNode 的setData 的入參也是 Object,這就是橋接方法的由來。

public void setData(Object data) {
 setData((Integer) data);
}

這樣一來重寫父類的方法,但是要把參數強轉成 Integer。

前面說的 node.setData("Hello");這一行會報錯,那大家就知道為什么了吧,是因為把 Hello強轉為 Integer 的時候出現的錯誤。

總結

正是類型擦除的機制幫助 Java 實現了泛型編程,讓我們作為開發者能夠更好的了解和控制我們正在使用類型的是什么,而不是 Object 滿天飛。

責任編輯:武曉燕 來源: 古時的風箏
相關推薦

2023-03-29 08:24:46

Rune類型開源項目

2021-08-24 08:05:41

泛型類型擦除Class

2023-10-11 08:29:54

volatileJava原子性

2020-03-05 10:28:19

MySQLMRR磁盤讀

2022-10-08 00:00:00

Spring數據庫項目

2020-09-27 06:53:57

MavenCDNwrapper

2020-09-22 08:22:28

快充

2010-11-01 01:25:36

Windows NT

2020-10-14 06:22:14

UWB技術感知

2011-04-27 09:30:48

企業架構

2020-10-27 10:26:03

編程開發Java

2009-06-09 22:11:44

JavaScriptObject

2021-01-21 21:24:34

DevOps開發工具

2021-09-01 23:29:37

Golang語言gRPC

2024-02-04 00:01:00

云原生技術容器

2023-07-12 15:32:49

人工智能AI

2021-02-05 10:03:31

區塊鏈技術智能

2021-07-07 05:07:15

JDKIterator迭代器

2025-01-13 07:00:00

Java泛型編程

2013-06-09 09:47:31

.NetPDBPDB文件
點贊
收藏

51CTO技術棧公眾號

国产精品福利av| 日韩精品中文字幕在线播放| 亚洲精品一区二区三| 69亚洲乱人伦| 涩涩视频在线播放| 国产精品色一区二区三区| 成人信息集中地欧美| 国产精品第72页| 精品久久久久中文字幕小说| 日韩亚洲欧美高清| 日韩中文字幕三区| 成人毛片av在线| 91污片在线观看| 91精品婷婷国产综合久久蝌蚪| 日韩欧美不卡视频| 一本一道久久综合狠狠老| 亚洲男人天堂2024| 黄色av电影网站| 91tv亚洲精品香蕉国产一区| 亚洲成人午夜影院| 99久久久无码国产精品性色戒| 天堂av在线免费| 国产一区二区在线视频| 国产精品99久久久久久www| 农村黄色一级片| 欧美伦理在线视频| 日韩国产在线看| 无套白嫩进入乌克兰美女| 欧美人体一区二区三区| 亚洲电影一级黄| www.黄色网址.com| 秋霞成人影院| 2024国产精品| 精品网站在线看| 在线观看一二三区| 欧美bbbbb| 日本国产欧美一区二区三区| 日本熟妇毛茸茸丰满| 亚洲一级淫片| 久久精品中文字幕电影| 免费成人深夜天涯网站| 免费成人高清在线视频theav| 精品国产乱码久久久久久牛牛 | 主播国产精品| 国产精品福利一区二区三区| 视频一区视频二区视频三区视频四区国产 | 欧美1—12sexvideos| 亚洲视频免费在线观看| 亚洲欧洲精品一区二区三区波多野1战4| 色播色播色播色播色播在线| 99国产欧美另类久久久精品 | av一区二区在线观看| 日韩毛片中文字幕| 亚欧洲乱码视频| 亚州av日韩av| 亚洲小视频在线| 欧美日韩高清丝袜| 欧美日韩激情在线一区二区三区| 亚洲丝袜av一区| 免费看黄色三级| heyzo久久| 最近更新的2019中文字幕| 成人小视频免费看| 久久精品青草| 欧美日韩不卡合集视频| 国产福利久久久| 99视频一区| 国产精品www网站| 91 中文字幕| 国产乱码精品1区2区3区| 99久久伊人精品影院| 好男人在线视频www| av中文字幕在线不卡| 欧美aaaaa喷水| 92国产在线视频| 亚洲狠狠丁香婷婷综合久久久| 国产一级不卡视频| 三级在线看中文字幕完整版| 在线亚洲免费视频| www.五月天色| 日韩动漫一区| 最近2019年好看中文字幕视频| sm捆绑调教视频| 狠狠爱成人网| 国产成人精品视频在线| 一区二区自拍偷拍| 成人永久免费视频| 神马影院一区二区| 先锋成人av| 色国产精品一区在线观看| 日本中文字幕影院| 欧美日韩另类图片| 日韩在线小视频| 日韩激情在线播放| 精品一区二区av| 久久精品丝袜高跟鞋| se在线电影| 亚洲第一成年网| 国产精品拍拍拍| 大陆精大陆国产国语精品| 亚洲人成在线观看| 久久久久久久久久久久国产| 天堂蜜桃91精品| 成人资源av| caoporn国产精品免费视频| 一区二区三区免费| 69久久久久久| 欧美理论电影在线精品| 精品久久国产精品| 亚洲色成人www永久网站| 国产伦精品一区二区三区免费| 麻豆亚洲一区| 国产黄色大片在线观看| 欧美人与z0zoxxxx视频| av网页在线观看| 综合久久婷婷| 国产精品影院在线观看| 色久视频在线播放| 亚洲国产成人porn| 天天操夜夜操很很操| 红桃成人av在线播放| 午夜免费日韩视频| jlzzjlzzjlzz亚洲人| 中文成人综合网| 中文字幕乱码人妻综合二区三区| 日韩一区二区三区在线看| 中文字幕亚洲欧美一区二区三区 | 久久精品第九区免费观看| aa在线视频| 69久久夜色精品国产69蝌蚪网| 91成人破解版| 亚洲永久在线| 久久精品人成| 三妻四妾的电影电视剧在线观看| 欧美大片一区二区| 五月婷婷一区二区| 国产一区二区三区四区在线观看| 清纯唯美一区二区三区| 中文在线免费二区三区| 亚洲精品第一国产综合精品| 国产在线拍揄自揄拍| 国产99精品视频| 黑人巨茎大战欧美白妇| 国产一区 二区| 久久精品国产99国产精品澳门 | 久久精品国产亚洲av高清色欲 | av第一福利在线导航| 日韩一区二区三区三四区视频在线观看| 欧美极品jizzhd欧美18| 日本美女视频一区二区| 亚洲精品第一区二区三区| 成人激情视屏| 中文字幕亚洲无线码a| 在线观看毛片网站| 国产精品夫妻自拍| 天天做天天干天天操| 91精品精品| julia一区二区中文久久94| 国内小视频在线看| 精品国产乱码久久久久久牛牛| 日本三级中文字幕| 26uuu色噜噜精品一区二区| 成人免费观看毛片| 日韩av免费大片| 666精品在线| 麻豆av在线播放| 日韩精品中文字幕在线播放| 樱花视频在线免费观看| 国产精品情趣视频| 日韩av福利在线观看| 韩日在线一区| 麻豆久久久av免费| 亚洲欧美专区| 国外成人在线播放| 国产粉嫩一区二区三区在线观看| 欧美午夜精品理论片a级按摩| 成人在线观看免费完整| 福利一区在线观看| 国产性xxxx18免费观看视频| 精品久久久亚洲| 亚洲最大的av网站| aa级大片免费在线观看| 在线视频日本亚洲性| 国产福利小视频| 日韩欧美国产高清91| 一级免费黄色录像| 99视频热这里只有精品免费| 人人爽人人av| 国产专区一区| 涩涩涩999| 国产精品流白浆在线观看| 国产成人欧美在线观看| 在线观看免费视频你懂的| 日韩精品有码在线观看| 97超碰人人草| 久久久久久久久久久久久久国产| 高清电影一区| 久久成人综合视频| 神马久久久久| 91精品国产91久久久久久一区二区 | 天天操,天天操| 一区视频在线看| 亚洲精品影院| 日韩电影不卡一区| 亚洲xxxx视频| 国产精品亚洲成在人线| 国模精品视频一区二区| 男人的天堂在线视频免费观看| 亚洲国产精品久久久久久| 中文在线免费看视频| 亚洲国产精品久久久久婷婷884| 国产精品美女高潮无套| 不卡的av电影| 少妇欧美激情一区二区三区| 视频一区二区三区中文字幕| 99久久免费观看| 久久一级电影| 视频一区二区在线| 亚洲精品3区| 国内视频一区| 亚洲一二三区视频| 91在线免费观看网站| 日本一道高清亚洲日美韩| 26uuu另类亚洲欧美日本一| 日本伦理一区二区| 日韩视频精品在线| 97超碰人人在线| 亚洲性生活视频| 免费毛片在线| 日韩经典中文字幕| 日批视频在线播放| 精品日韩在线观看| av中文字幕第一页| 91精品久久久久久蜜臀| 中国一区二区视频| 在线观看国产日韩| 国产精品久免费的黄网站| 欧美日韩亚洲一区二| 欧美三日本三级少妇99| 午夜视频在线观看一区| 国产午夜精品无码| 亚洲成人av在线电影| 精品无码av在线| 亚洲成人在线免费| 99久在线精品99re8热| 天天综合色天天| 91浏览器在线观看| 日韩欧美黄色动漫| 精人妻无码一区二区三区| 日韩欧美在线第一页| 在线观看免费国产视频| 欧美日韩亚洲精品内裤| 亚洲欧美一二三区| 91成人国产精品| 亚洲天堂自拍偷拍| 欧美日韩一级二级三级| 在线观看免费观看在线| 欧美精品日韩综合在线| 国产伦精品一区二区三区四区| 欧美日韩亚洲不卡| 一区二区三区日| 精品乱人伦一区二区三区| 亚洲精华国产精华精华液网站| 欧美α欧美αv大片| 蜜臀av在线观看| 亚洲欧美在线x视频| 91这里只有精品| 久久777国产线看观看精品| 19禁羞羞电影院在线观看| 日韩av色在线| 91麻豆精品| 国产在线精品一区二区三区》 | 成人一级片网址| 免费中文字幕av| 国产精品色在线观看| 人妻人人澡人人添人人爽| 亚洲国产成人va在线观看天堂| 亚洲免费不卡| 国产h在线观看| 国产亚洲欧洲高清| а√中文在线8| 91av视频在线观看| 国产香蕉久久| 国产91免费视频| 国产精品嫩模av在线| 一区二区视频国产| 99在线热播精品免费99热| 黄色高清无遮挡| 国产一区二区视频在线播放| 制服丝袜第一页在线观看| 欧美国产视频在线| 久久免费视频播放| 日韩欧美主播在线| av网站在线观看免费| 日韩国产欧美精品一区二区三区| 在线观看免费黄视频| 久久久久久久久久久av| 全球最大av网站久久| www久久99| 视频在线不卡免费观看| 秋霞无码一区二区| 国产在线乱码一区二区三区| 欧美狂猛xxxxx乱大交3| 一区二区三区在线视频观看58| 国产婷婷色一区二区在线观看| 日韩一区二区在线观看视频| 你懂的视频在线观看| 欧美黑人巨大xxx极品| 国产电影一区二区三区爱妃记| 国产精品高清一区二区三区| 欧美岛国激情| 亚洲爆乳无码专区| 成人免费高清在线观看| 午夜精品福利在线视频| 在线中文字幕一区| 青青草在线免费观看| 久久久久久久久久久av| 精品中文在线| 在线观看欧美亚洲| 日本中文字幕不卡| 免费看黄色aaaaaa 片| 亚洲影院在线观看| 国产喷水吹潮视频www| 综合网日日天干夜夜久久| 久久野战av| 久久久久久a亚洲欧洲aⅴ| 国产精品豆花视频| 91欧美一区二区三区| 国产精品午夜在线观看| 欧美a视频在线观看| 亚洲精品电影网| av中文资源在线资源免费观看| 99久久精品免费看国产一区二区三区| 99视频精品视频高清免费| 激情综合网俺也去| 久久久精品日韩欧美| 天堂在线免费观看视频| 亚洲国产精品久久久久| 高潮在线视频| 国产一区在线免费| 夜夜嗨av一区二区三区网站四季av| 成人欧美精品一区二区| 一区二区三区不卡视频| 国产人妖在线播放| 欧美成人亚洲成人日韩成人| 国产精品白丝久久av网站| 亚洲第一精品区| 国产一区啦啦啦在线观看| 欧美交换国产一区内射| 日韩一区二区不卡| 丁香花在线电影小说观看| 国产精品视频500部| 国产精品久久777777毛茸茸| 国产特级黄色录像| 欧美视频一区二区三区四区| 爱久久·www| 成人午夜高潮视频| 欧美一区综合| 日韩综合第一页| 欧美日韩国产一区二区| 欧美xxx.com| 国产中文字幕亚洲| 欧美一区激情| 完美搭档在线观看| 日本韩国精品在线| 日韩美女网站| 成人免费看片网址| 亚洲精品少妇| 久久国产柳州莫菁门| 在线成人av影院| zzzwww在线看片免费| 欧美日本韩国在线| 久久99精品久久久久婷婷| 日本一级二级视频| 日韩精品高清视频| 国产极品一区| 欧美日韩激情四射| 久久综合九色综合久久久精品综合 | 91在线色戒在线| 在线观看日韩av电影| 日本少妇高潮喷水xxxxxxx| 欧美妇女性影城| 99re6在线精品视频免费播放| 日本成人黄色免费看| 国产在线国偷精品产拍免费yy| 日本午夜小视频| 尤物yw午夜国产精品视频| av成人资源| 中文字幕有码av| 亚洲国产一区二区三区青草影视| 青青草在线播放| 91成人免费视频| 日韩综合小视频| 日本免费在线播放| 在线播放日韩欧美| 国产精品115| 日本一二区免费| 欧美性猛交xxxx偷拍洗澡 | 情事1991在线| 综合久久一区|