精品欧美一区二区三区在线观看 _久久久久国色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 滿天飛。

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

2019-12-09 10:02:41

泛型ypeScript前端

2024-09-12 08:32:42

2025-02-21 08:48:16

Typescript內置聯合類型

2018-02-13 14:48:17

戴爾

2022-07-06 10:33:39

技術債務CIO

2017-12-13 15:57:12

2024-12-05 11:03:04

2021-09-21 15:56:00

iPhone 13蘋果雙十一

2024-07-29 09:03:00

2021-07-28 21:32:43

手機蘋果小米

2025-05-29 01:55:00

Vue3.5API性能

2019-12-06 09:29:12

瀏覽器HTML編程語言

2022-06-17 18:49:25

pythonexcel

2019-08-08 16:00:08

HTTPGETPOST

2024-03-04 08:49:44

2020-04-28 15:10:00

阿里巴巴互聯網離職

2021-01-30 11:42:53

迭代器代碼元素

2021-06-24 09:08:34

Java代碼泛型

2017-12-08 10:49:24

前端WebjQuery

2024-01-24 12:09:33

代碼Lodash前端
點贊
收藏

51CTO技術棧公眾號

欧美丰满熟妇bbb久久久| 99re99热| 中文字幕第一页在线播放| 91视频久久| 精品国产一区久久| 欧美日韩亚洲自拍| 国产99re66在线视频| 久久久影视传媒| 97人摸人人澡人人人超一碰| 秋霞精品一区二区三区| 中文字幕一区二区三区在线视频| 精品sm捆绑视频| 天天看片天天操| 午夜av不卡| 伊人一区二区三区| 日韩中文一区二区三区| 色欲av伊人久久大香线蕉影院| 日韩精品视频网站| 韩国日本不卡在线| 午夜爽爽爽男女免费观看| 国产图片一区| 日韩一区二区三区视频| 爱情岛论坛成人| 激情aⅴ欧美一区二区欲海潮| 亚洲欧洲日韩女同| 特级西西444www大精品视频| 风流少妇一区二区三区91| 久久电影网站中文字幕 | 国产日韩久久| av免费在线观看不卡| 日韩成人精品在线观看| 97在线视频免费看| 国产精品第72页| 欧美高清一区| 另类色图亚洲色图| 日韩在线观看免| 日产精品一区二区| 亚洲天堂免费在线| 成人免费看aa片| 美女一区二区在线观看| 欧美成人video| 国产精品19p| 九九99久久精品在免费线bt| 欧美日韩精品综合在线| 我看黄色一级片| 日韩毛片在线| 欧美日韩一区 二区 三区 久久精品| 少妇性饥渴无码a区免费| 免费看男女www网站入口在线 | 亚洲精品中文字幕乱码三区91| 欧美激情偷拍| 久久夜色精品国产欧美乱| 欧美一区免费观看| 综合久久十次| 欧美—级高清免费播放| 欧美爱爱小视频| 黄色成人精品网站| 欧美日本高清视频| 日本少妇xxxx动漫| 国产日韩视频| 国产成人涩涩涩视频在线观看| 看黄色一级大片| 另类欧美日韩国产在线| 91久久国产综合久久91精品网站| 国产丰满美女做爰| 成人精品视频网站| 久久福利电影| yiren22亚洲综合伊人22| 国产精品三级在线观看| www.-级毛片线天内射视视| 超碰公开在线| 亚洲va欧美va人人爽午夜| 日韩av黄色网址| 成人看片毛片免费播放器| 欧美另类videos死尸| 在线播放国产视频| 日韩三级视频| 精品激情国产视频| 久久久久99精品| 丝袜诱惑制服诱惑色一区在线观看 | 我想看黄色大片| 亚洲午夜精品一区二区国产| 欧美极品少妇全裸体| 久久久久久少妇| 久久精品久久综合| 国产精品国产精品国产专区不卡| 你懂的好爽在线观看| 亚洲丝袜精品丝袜在线| 黄色国产一级视频| 日本黄色成人| 亚洲精品久久久久久久久久久久久| 亚洲精品午夜视频| 欧美另类专区| 国产高清视频一区三区| 99久久婷婷国产一区二区三区| 99久久久无码国产精品| 亚洲一区二区在线看| 国产粉嫩在线观看| 欧美精品18+| 久久中文字幕人妻| 欧美阿v一级看视频| 日本精品久久久久影院| 国产黄a三级三级看三级| 99精品久久只有精品| 永久免费网站视频在线观看| 欧美粗大gay| 精品国产污污免费网站入口| 中文字幕第24页| 亚洲欧美日韩视频二区| 7777奇米亚洲综合久久| 91网在线播放| 色视频成人在线观看免| 四虎永久免费观看| 久久久精品久久久久久96| 日韩69视频在线观看| 亚洲精品网站在线| 亚洲人亚洲人成电影网站色| 日韩无套无码精品| 欧美激情网址| 韩国欧美亚洲国产| 丰满熟女一区二区三区| 国产精品成人免费精品自在线观看| 欧美亚洲另类色图| 成人香蕉社区| 欧美大片免费观看| 国产特黄一级片| 日韩一区中文字幕| 亚洲污视频在线观看| 蜜桃a∨噜噜一区二区三区| 欧美激情一级二级| 国产精品羞羞答答在线| 国产精品人妖ts系列视频| 99精品免费在线观看| 日韩伦理一区二区三区| 91国产在线精品| 日本激情视频网站| 亚洲一区二区三区四区中文字幕| 日本一区二区三区在线免费观看| 久久国产亚洲精品| 国产有码一区二区| 岛国视频免费在线观看| 色婷婷久久综合| 一级片手机在线观看| 性xx色xx综合久久久xx| 久久精品一区二区三区不卡免费视频| 黑人另类精品××××性爽| 日韩一区二区免费在线电影| 日韩在线观看视频一区二区| 国产在线播放一区三区四| 在线观看成人av电影| 伊人久久大香线蕉综合影院首页| 日韩在线免费视频| 国产美女自慰在线观看| 亚洲激情中文1区| 一级黄色大片免费看| 亚洲私拍自拍| 久久er99热精品一区二区三区| 亚洲妇女成熟| 国产一区二区久久精品| 亚洲中文字幕在线一区| 亚洲乱码国产乱码精品精98午夜| 中文字幕1区2区| 亚洲区国产区| 日韩精品伦理第一区| 成人免费视频观看| 欧美成人激情在线| 欧美天堂在线视频| 91精品福利视频| 情侣偷拍对白清晰饥渴难耐| 国产美女在线观看一区| 91动漫在线看| 国产亚洲第一伦理第一区| 国产精自产拍久久久久久| 超碰免费公开在线| 日韩激情在线视频| 在线观看中文字幕码| 一区二区三区国产豹纹内裤在线| 亚洲黄色免费在线观看| 日本欧美久久久久免费播放网| 亚洲欧美日韩不卡| 欧美wwwwww| 国产日韩欧美中文| av老司机在线观看| 一区二区三区四区精品| 亚洲va久久久噜噜噜无码久久| 欧美日韩国产一区中文午夜| 五月天婷婷丁香网| 成人avav在线| 中文字幕成人在线视频| 日韩五码在线| 一本色道久久综合亚洲精品婷婷 | 97超碰人人干| 一区视频在线播放| 欧美精品黑人猛交高潮| 精品视频在线一区二区| 久久精品欧美一区二区三区麻豆| 91亚洲免费视频| 国产视频久久| 久久av喷吹av高潮av| 竹菊久久久久久久| 91九色偷拍| 精品视频在线一区二区在线| 欧美激情国产精品| yw在线观看| 亚洲精品一区二区在线| 国产精品久久久久久免费免熟| 福利一区福利二区微拍刺激| 老湿机69福利| 亚洲国产高清不卡| 变态另类丨国产精品| 国产精品自产自拍| 色乱码一区二区三区在线| 在线视频观看日韩| 免费成人深夜夜行网站视频| 黄色不卡一区| 久久青青草原| 美女视频亚洲色图| 国产福利一区二区三区在线观看| 青青在线精品| 国产成+人+综合+亚洲欧洲| a在线视频v视频| 九九精品视频在线观看| 男人和女人做事情在线视频网站免费观看| 日韩精品免费在线视频| 人妻丰满熟妇av无码区hd| 在线成人免费观看| 亚洲综合精品国产一区二区三区| 欧美午夜性色大片在线观看| 日韩精品一卡二卡| 亚洲国产成人高清精品| 激情四射综合网| 一区二区三区中文在线观看| 欧美视频一区二区在线| 国产精品三级久久久久三级| 欧洲美熟女乱又伦| 国产亚洲一区二区三区四区| 日韩网站在线播放| ww久久中文字幕| 欧美黑人欧美精品刺激| 99久久综合狠狠综合久久| 亚洲少妇18p| 99精品国产热久久91蜜凸| 五月开心播播网| 99re视频精品| 男生裸体视频网站| 91免费看`日韩一区二区| 中文字幕在线免费看线人| a亚洲天堂av| 久久国产精品影院| 国产欧美日本一区二区三区| 久久丫精品忘忧草西安产品| 国产欧美日韩精品一区| 成人免费视频入口| 亚洲三级理论片| 欧美黑人一级片| 亚洲一区二区欧美日韩| 日韩福利片在线观看| 偷拍一区二区三区| 久久精品久久久久久久| 在线观看91视频| 91av久久久| 欧美成人乱码一区二区三区| 视频一区 中文字幕| 日韩精品视频在线免费观看| 国产精品一区二区婷婷| 色午夜这里只有精品| dy888亚洲精品一区二区三区| 欧美高清videos高潮hd| 日韩脚交footjobhd| 国产精品美女无圣光视频| 成人污污www网站免费丝瓜| 超碰97在线资源| 欧美日韩播放| 一本—道久久a久久精品蜜桃| 欧美午夜影院| 欧美午夜性生活| 国产麻豆91精品| 青青草视频播放| 国产精品国产三级国产专播品爱网| 性色av无码久久一区二区三区| 午夜久久电影网| 中文字幕乱码在线观看| 精品免费国产二区三区 | 亚洲一级大片| 蜜桃av噜噜一区二区三| 久久中文字幕av一区二区不卡| 国产成人一二三区| 久久精品综合| 97超碰免费在线观看| 91麻豆福利精品推荐| 欧美日韩色视频| 日韩欧美国产一区二区| 国产巨乳在线观看| 亚洲欧美精品一区二区| 超碰人人在线| 国产精品久久久久aaaa九色| 97一区二区国产好的精华液| 午夜欧美性电影| 亚洲全部视频| 成人三级做爰av| 国产片一区二区| 国产性xxxx高清| 91精品在线免费观看| 国产区高清在线| 性日韩欧美在线视频| 亚洲国产aⅴ精品一区二区三区| 久久狠狠久久综合桃花| 亚洲天天影视网| 国产精品拍拍拍| 久久伊人中文字幕| 国产大片aaa| 日韩视频一区二区三区| 在线免费黄色| 日本视频久久久| 久久夜色电影| 精品丰满人妻无套内射| 国产一区二区在线免费观看| 四虎国产精品成人免费入口| 亚洲18女电影在线观看| 国产高潮在线观看| 精品激情国产视频| 欧美视频精品| 日韩欧美亚洲日产国| 亚洲一区免费| 中文字幕在线永久| 亚洲国产日韩a在线播放性色| 国产又黄又爽视频| 亚洲图中文字幕| 成人欧美大片| 欧美高清视频一区二区三区在线观看| 欧美三级第一页| 亚洲性图第一页| 亚洲视频1区2区| 国产特级黄色片| 久久av资源网站| 国产精品免费精品自在线观看| 亚洲成人自拍视频| 裸体一区二区三区| 黑人狂躁日本娇小| 在线播放欧美女士性生活| 蜜桃av在线免费观看| 国产男人精品视频| 99久久国产综合精品成人影院| 97超碰人人爽| 亚洲美女屁股眼交3| 精品久久久中文字幕人妻| 另类图片亚洲另类| 日本精品国产| 成人性生活视频免费看| 菠萝蜜视频在线观看一区| 日本一二三区不卡| 亚洲国产婷婷香蕉久久久久久| www.youjizz.com在线| 久久久久欧美| 日韩精品三区四区| www.xxxx日本| 欧美成人精品3d动漫h| 国产99在线| 日韩不卡av| 国内成人精品2018免费看| 久久精品视频免费在线观看| 欧美成人精品福利| 在线免费看h| 一本一道久久a久久综合精品| 国产一区二区三区免费在线观看| 久草福利资源在线观看| 日韩成人在线电影网| 国产综合色区在线观看| 亚洲午夜精品久久| 国产91综合一区在线观看| 日本三级小视频| 中文国产成人精品久久一| 国产视频一区二区在线播放| 隔壁人妻偷人bd中字| 久久久久久久免费视频了| 亚洲精品一区二三区| 久色乳综合思思在线视频| 精品欧美午夜寂寞影院| 国产v亚洲v天堂无码久久久| 中文字幕五月欧美| 欧美性受xxxx狂喷水| 国产精品欧美日韩一区二区| 欧美日本一区二区视频在线观看| 国产激情视频网站| 欧美日韩国产美| www.综合| 欧美aaa在线观看| 91视频在线观看免费| 国产免费av观看| 国产98色在线| 黄色综合网站| 手机看片国产日韩| 日韩av在线免费观看一区| 亚瑟国产精品| 无码精品国产一区二区三区免费| 综合自拍亚洲综合图不卡区| 国产91在线免费| 丁香婷婷综合网| 亚洲午夜激情视频| 欧美在线一级va免费观看|