如何通俗易懂地理解什麼叫泛型?

2020-12-15 劉小愛

今天是劉小愛自學Java的第55天。

感謝你的觀看,謝謝你。

話不多說,開始今天的學習:

補充學習一個知識點:泛型。

這個概念是在集合中接觸到的,因為當時學的有點懵,所以就沒有立馬寫出來。

現在回過頭來看,發現還是蠻簡單的。

一、泛型的概念

先回顧下集合和數組的區別:

數組長度固定不變,可以存放任意數據類型,但存放的數據類型要一致。集合長度可變,可以存放任意引用數據類型,但存儲的數據類型可以不一致。也就是說一個集合既可以存放String類型的數據又可以存放Integer類型數據(int對應的引用數據類型)。

這樣就會出現一個問題:

比如說:現在有一個集合,打算存儲群裡所有人的名字,結果有的人搗亂把年齡也存進去了。

這個時候編譯是不會報錯的,因為集合本來就可以存放多種數據類型,但是我以為只有名字,也就是字符串。

①在Collection集合中添加一個String類型的數據。

②在Collection集合中添加一個Integer類型的數據(18會自動轉換成對應的引用數據類型)。

③現在我想統計群裡人名都是多少字的,我以為只有字符串,就會將其強轉成String並調用String的lenth方法。

④運行報錯,因為有一個其他數據類型的數據混進來了,編譯時期不能檢測到,運行時會出現類轉化異常。

所以面對這種問題該怎麼辦呢?

這種時候,就需要使用到泛型了。

創建集合時先說清楚,只能存放String類型的數據,這時候若是有人搗亂存儲其他類型的數據編譯就會報錯。

等於是將運行時期會發生的異常提前到編譯時期了

所以泛型的作用是一種安全機制,是一種書寫規範,它和接口的作用有著一定的類似,都是在制定規則。

如何理解接口?

接口裡的抽象方法只有方法名,沒有方法體,實現類必須重寫該方法說明方法體。

用現實裡的一個例子說明就是:語文老師只給你一個題目,你要寫一篇800字的作文。

題目名就好比抽象方法,作文就好比實現類重寫方法。

所以接口就和作文題目一樣是在制定規則。

如何理解泛型?

作文題材不限,記敘文、議論文、詩歌都可以。

但是不能一篇作文既寫成記敘文又寫成議論文。

一旦你確定了題材(比如說寫議論文),那麼這篇作文就不能寫其他題材了(只能寫議論文)想寫其他題材,那下一篇作文重新寫。

所以什麼叫泛型?

就好比作文題材不限,但一次只能寫一種題材,至於是什麼題材,由我們自己定。

所以本質上泛型它是一個變量,它是需要我們去賦值的。

二、泛型的使用

主要有泛型類、泛型接口、泛型方法以及泛型通配符。

1泛型類

非常常見的ArrayList類就是一個泛型類,看它的源碼:

①泛型使用格式

修飾符 class 類名<代表泛型的變量> { };

ArrayList類中使用E來代表泛型的變量,E本身並沒有含義,任意一個大寫字母都可以,A、B、T、W都可以。

②泛型類的使用

在創建對象的時候確定泛型,指定好了後這個對象就只能裝指定的數據類型了。

如果要換其他數據類型,就要重新創建該類的對象,重新指定泛型。泛型類有何好處?

③ArrayList的add方法

add方法參數就是一個泛型,也就是說創建對象時確定的是哪個類型,使用add方法就只能添加這個類型了,這就起到了一個千變萬化的效果。

2泛型接口

①泛型接口格式

修飾符 interface接口名<代表泛型的變量> { }

這次我們自定義一個泛型接口,泛型為A。

②泛型類的使用一

實現類實現接口、同時指定泛型類型。

③泛型類的使用二

實現類實現接口但不指定泛型,這個類也就成了泛型類。

ArrayList類本質上也就是這種情況,它實現了List<E>接口,但是沒有指定泛型。

3泛型方法

①泛型方法格式

修飾符 <代表泛型的變量> 返回值類型 方法名(參數){ }

②泛型方法使用

調用方法時,確定泛型的類型。

4泛型通配符

現有一個需求:封裝一個方法,可以遍歷參數為任意類型的ArrayList

①兩個不同類型的集合

一個集合泛型為String類,一個集合泛型為Integer:

ArrayList<String>list1和ArrayList<Integer> list2是兩個不同的類型,如果用常規方法,那要兩個方法(方法重載)

②泛型的通配符

不知道使用什麼類型來接收的時候,此時可以使用??表示未知通配符。

其中泛型通配符還可以這樣使用:

<? extends Person>:表示可以傳遞Person及其子類<? super Person>:表示可以傳遞Person及其父類注意:

泛型不存在繼承關係:ArrayList<Object>list並不是ArrayList<String>list1和ArrayList<Integer>list2的父類,它們三個是三個不同的類型。其中Java裡的泛型是一種偽泛型。什麼叫偽泛型?

也就是泛型只存在於編譯時期,在運行時期會被擦除,這個比較抽象不好說明,了解就好了。真泛型也是有的,但在Java語言裡沒有,C語言裡有。

總結:

謝謝你的觀看。

如果可以的話,麻煩幫忙點個讚,謝謝你。

相關焦點

  • Java泛型背後是什麼
    這一節主要講的內容是java中泛型的應用,通過該篇讓大家更好地理解泛型,以及面試中經常說的泛型類型擦除是什麼概念,今天就帶著這幾個問題一起看下:舉一個簡單的例子:這裡可以看出來在代碼編寫階段就已經報錯了,不能往string類型的集合中添加int類型的數據。
  • 計算機泛型
    當我們不知道往集合裡面放入什麼數據時候,當這種情況出現時,我們考慮的就是泛型。何為泛型?通俗點說:一個模型,不固定的模型,但我們要提前準備好這個模型,如果對應遊戲裡面的規則的話,就是所謂的預判,我們把這個模型準備了,當我們需要用到的時候,直接使用這個模型改造成自己想要的模樣。
  • Java泛型的特點與優缺點,泛型擦除是怎麼回事?
    這道題想考察什麼?Java 是如何支持泛型的?底層實現?
  • Java 泛型背後的原理是什麼?
    下面我們通過例子來介紹泛型背後數據是什麼類型public class BaseBean<T> {    T value;    public T getValue() {        return value;    }    public void setValue(T value
  • Java泛型解析,了解泛型使用
    Java 泛型泛型的本質是參數化類型。簡單解釋就是,將參數的數據類型也當作參數對待。泛型的目的就是為了寫一套代碼,可以到處通用,不用擔心類型安全的問題。泛型可以用在類、接口、方法中對應的就是泛型類、泛型接口和泛型方法。一、為什麼要引入泛型?
  • 掃盲:Kotlin 的泛型
    很多同學總是會產生這些疑問:Kotlin 泛型和 Java 泛型到底有何區別?Java 泛型存在的意義到底是什麼?Java 的類型擦除到底是指什麼?Java 泛型的上界、下界、通配符到底有何區別?它們可以實現多重限制麼?Java 的 <? extends T>、<?
  • 泛型:泛型的定義(類、接口、對象)、使用、繼承
    設計泛型的初衷:    1) 主要是為了解決Java容器無法記憶元素類型的問題:         i. 由於Java設計之初並不知道會往容器中存放什麼類型的元素,因此元素類型都設定為Object,這樣就什麼東西都能放了!         ii.
  • Java面試重要考點攻克:如何在Java中使用泛型?
    正確理解泛型對於掌握Java至關重要,這也會對你的面試有所助益。本文是關於Java中泛型知識的大放送,泛型是什麼,如何在Java中使用,以及它們的優點有哪些,你都能在下文中找到答案。在Java 5中添加泛型是為了提供編譯時類型檢查,並消除使用集合類時常見的 ClassCastException 風險。
  • Java之使用泛型與未使用泛型的區別
    各位小夥伴們大家好,在之前的文章中,小編有介紹過Java之泛型的概念,這次小編要介紹的是,Java程序中,使用泛型與未使用泛型的區別。代碼如下:public class Demo01Generic {public static void main(String[] args) { show01(); show02(); } /*創建集合對象,使用泛型好處:1.避免了類型轉換的麻煩,存儲的是什麼類型的數據,取出的就是什麼類型的數據 2.把運行期異常
  • 如何通俗易懂地理解什麼是去槓桿?
    如何最通俗理解去槓桿,沒有比例子更直觀的了。小白想開店做生意,但手頭只有1萬塊現金,不夠。怎麼辦呢?
  • Java 泛型詳解-絕對是對泛型方法講解最詳細的,沒有之一
    本文參考java 泛型詳解、Java中的泛型方法、 java泛型詳解概述泛型在java中有很重要的地位,在面向對象編程及各種設計模式中有非常廣泛的應用。什麼是泛型?為什麼要使用泛型?泛型,即「參數化類型」。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?
  • Java泛型簡明教程
    相對於依賴程式設計師來記住對象類型、執行類型轉換——這會導致程序運行時的失敗,很難調試和解決,而編譯器能夠幫助程式設計師在編譯時強制進行大量的類型檢查,發現其中的錯誤。泛型的構成由泛型的構成引出了一個類型變量的概念。
  • Java 泛型背後的原理
    ,通過該篇讓大家更好地理解泛型,以及面試中經常說的泛型類型擦除是什麼概念,今天就帶著這幾個問題一起看下:舉一個簡單的例子:這裡可以看出來在代碼編寫階段就已經報錯了,不能往string類型的集合中添加int類型的數據。
  • 泛型Java程式設計師必備基礎
    前言整理了Java泛型的相關知識,算是比較基礎的,希望大家一起學習進步。一、什麼是Java泛型Java 泛型(generics)是 JDK 5 中引入的一個新特性,其本質是參數化類型,解決不確定具體對象類型的問題。
  • Java泛型總結
    什麼是泛型泛型是jdk5引入的類型機制,就是將類型參數化,它是早在1999年就制定的jsr14的實現。泛型機制將類型轉換時的類型檢查從運行時提前到了編譯時,使用泛型編寫的代碼比雜亂的使用object並在需要時再強制類型轉換的機制具有更好的可讀性和安全性。
  • Java泛型概念相關面試題匯總.
    來源:http://1t.click/G2m問:Java 的泛型是什麼?有什麼好處和優點?JDK 不同版本的泛型有什麼區別?問:Java 泛型是如何工作的?什麼是類型擦除?問:Java 如何優雅的實現元組?答: 元組其實是關係資料庫中的一個學術名詞,一條記錄就是一個元組,一個表就是一個關係,紀錄組成表,元組生成關係,這就是關係資料庫的核心理念。
  • Java 泛型詳解
    看完了泛型類,接下來我們來了解一下泛型方法。如何閱讀過一些Java集合類的源碼,可以發現通常我們會將兩者結合起來一起用,比如像下面這樣:public class Collections {    public static <T> void copy(List<? super T> dest, List<?
  • JAVA總結篇系列-泛型
    泛型概念的提出(為什麼需要泛型)?那麼有沒有什麼辦法可以使集合能夠記住集合內元素各類型,且能夠達到只要編譯時不出現問題,運行時就不會出現「java.lang.ClassCastException」異常呢?答案就是使用泛型。 二.什麼是泛型?泛型,即「參數化類型」。
  • 【深度好文】一篇文章告訴你如何使用Java泛型?
    作者 | IT168企業級編輯 | Kavien原文 | http://www.toutiao.com/a6458786183567639054/只要了解了泛型的一般使用情況就能夠解決多半的問題。所以,首先我們來了解一下什麼是泛型、為什麼要使用它以及應用方法。什麼是泛型?
  • Java總結篇系列:Java泛型
    泛型概念的提出(為什麼需要泛型)?那麼有沒有什麼辦法可以使集合能夠記住集合內元素各類型,且能夠達到只要編譯時不出現問題,運行時就不會出現「java.lang.ClassCastException」異常呢?答案就是使用泛型。二.什麼是泛型?泛型,即「參數化類型」。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?