Java泛型總結

2020-12-13 CSDN

什麼是泛型

泛型是jdk5引入的類型機制,就是將類型參數化,它是早在1999年就制定的jsr14的實現。

泛型機制將類型轉換時的類型檢查從運行時提前到了編譯時,使用泛型編寫的代碼比雜亂的使用object並在需要時再強制類型轉換的機制具有更好的可讀性和安全性。

泛型程序設計意味著程序可以被不同類型的對象重用,類似c++的模版。

泛型對於集合類尤其有用,如ArrayList。這裡可能有疑問,既然泛型為了適應不同的對象,ArrayList本來就可以操作不同類型的對象呀?那是因為沒有泛型之前採用繼承機制實現的,實際上它只維護了一個Object對象的數組。結果就是對List來說它只操作了一類對象Object,而在用戶看來卻可以保存不同的對象。

泛型提供了更好的解決辦法——類型參數,如:

List list = new ArrayList();

這樣解決了幾個問題:

1 可讀性,從字面上就可以判斷集合中的內容類型;

2 類型檢查,避免插入非法類型。

3 獲取數據時不在需要強制類型轉換。

泛型類

public class Pair{

private T field1;

}

其中 <T> 是類型參數定義。

使用時:Pair<String> p = new Pair<String>();

此時類內部的field1就是字符串類型了。

如果引用多個類型,可以使用逗號分隔:<S, D>

類型參數名可以使用任意字符串,建議使用有代表意義的單個字符,以便於和普通類型名區分,如:T代表type,有原數據和目的數據就用S,D,子元素類型用E等。當然,你也可以定義為XYZ,甚至xyZ。

泛型方法

泛型方法定義如下:

public static T marshalle(T arg){}

與泛型類一樣,<T> 是類型參數定義。如:

public class GenericMethod {

public static T getMiddle(T… a){

return a[a.length/2];

嚴格的調用方式:

String o=GenericMethod.getMiddle(「213」,」result」,」12」);

一般情況下調用時可以省略,看起來就像定義String類型參數的方法: GenericMethod.getMiddle(String,String,String),這是因為jdk會根據參數類型進行推斷。看一下下面的例子:

Object o=GenericMethod.getMiddle(「213」,0,」12」);

System.out.println(o.getClass());

System.out.println(o);

輸出結果為:

class java.lang.Integer

0

這是因為jdk推斷三個參數的共同父類,匹配為Object,那麼相當於:

習慣了類型參數放在類的後面,如ArrayList<String>,泛型方法為什麼不放在後面?看一個例子:

public static

相關焦點

  • Java總結篇系列:Java泛型
    泛型概念的提出(為什麼需要泛型)?因為編譯階段正常,而運行時會出現「java.lang.ClassCastException」異常。因此,導致此類錯誤編碼過程中不易發現。在如上的編碼過程中,我們發現主要存在兩個問題:1.當我們將一個對象放入集合中,集合不會記住此對象的類型,當再次從集合中取出此對象時,改對象的編譯類型變成了Object類型,但其運行時類型任然為其本身類型。
  • JAVA總結篇系列-泛型
    泛型概念的提出(為什麼需要泛型)?2.因此,//1處取出集合元素時需要人為的強制類型轉化到具體的目標類型,且很容易出現「java.lang.ClassCastException」異常。那麼有沒有什麼辦法可以使集合能夠記住集合內元素各類型,且能夠達到只要編譯時不出現問題,運行時就不會出現「java.lang.ClassCastException」異常呢?答案就是使用泛型。
  • 為什麼我們需要Java中的泛型類型?
    泛型類型在Java集合中廣泛使用。為什麼我們需要Java中的泛型類型?理解這個問題可以幫助我們更好地理解許多相關概念。在本文中,我將使用一個非常簡短的示例來說明Generic為什麼有用。1.泛型概述實現泛型的目的是在編譯時而不是運行時中發現錯誤。在編譯時查找錯誤可以節省調試Java程序的時間,因為編譯時錯誤更容易查找和修復。泛型類型僅在編譯時存在。這是學習Java泛型時要記住的最重要的事情。2.如果沒有泛型怎麼辦?
  • Java泛型的特點與優缺點,泛型擦除是怎麼回事?
    如果允許創建泛型數組 p,將能在數組p裡存放任何類的對象,並且能夠通過編譯,因為在編譯階段p被認為是一個 Object[ ],也就是 p 裡面可以放一個 int,也可以放一個 Pair,當我們取出裡面的 int,並強制轉換為 Pair,調用它的info()時會怎樣?java.lang.ClassCastException!這就違反了泛型引入的原則(提高程序安全性)。
  • Java之使用泛型與未使用泛型的區別
    各位小夥伴們大家好,在之前的文章中,小編有介紹過Java之泛型的概念,這次小編要介紹的是,Java程序中,使用泛型與未使用泛型的區別。代碼如下:public class Demo01Generic {public static void main(String[] args) { show01(); show02(); } /*創建集合對象,使用泛型好處:1.避免了類型轉換的麻煩,存儲的是什麼類型的數據,取出的就是什麼類型的數據 2.把運行期異常
  • Java反射,泛型在Json中的運用
    最近項目中遇到了Json數據自動獲取的功能,不然令人想起java的反射,已經很長時間沒複習java了正好一塊連java的這一塊內容一起過一遍。java中的反射無疑就相當於java開發者的春天,在眾多的框架中也能看到它的身影,可以在運行時檢查類,接口、變量和方法等信息,可以實例化調用方法以及設置變量值等。本文主要以代碼的形式直接將反射,泛型的運用展現出來。java中的反射首先新建一個基礎類Author。
  • Java 泛型詳解-絕對是對泛型方法講解最詳細的,沒有之一
    本文參考java 泛型詳解、Java中的泛型方法、 java泛型詳解概述泛型在java中有很重要的地位,在面向對象編程及各種設計模式中有非常廣泛的應用。什麼是泛型?為什麼要使用泛型?泛型,即「參數化類型」。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?
  • 泛型Java程式設計師必備基礎
    其所操作的數據類型被指定為一個參數(type parameter)這種參數類型可以用在類、接口和方法的創建中,分別稱為泛型類、泛型接口、泛型方法。泛型類泛型類(generic class) 就是具有一個或多個類型變量的類。
  • Java泛型解析,了解泛型使用
    Java 泛型泛型的本質是參數化類型。簡單解釋就是,將參數的數據類型也當作參數對待。泛型的目的就是為了寫一套代碼,可以到處通用,不用擔心類型安全的問題。泛型可以用在類、接口、方法中對應的就是泛型類、泛型接口和泛型方法。一、為什麼要引入泛型?
  • Java 泛型背後的原理
    作者 | 的一幕  來源 | https://www.jianshu.com/p/dd34211f2565這一節主要講的內容是java中泛型的應用,通過該篇讓大家更好地理解泛型,以及面試中經常說的泛型類型擦除是什麼概念,今天就帶著這幾個問題一起看下:舉一個簡單的例子:這裡可以看出來在代碼編寫階段就已經報錯了,不能往string類型的集合中添加int類型的數據。
  • Java 泛型 T,E,K,V,?,傻傻分不清?
    泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。 # 泛型帶來的好處 在沒有泛型的情況的下,通過對類型 Object 的引用來實現參數的「任意化」,「任意化」帶來的缺點是要做顯式的強制類型轉換,而這種轉換是要求開發者對實際參數類型可以預知的情況下進行的。
  • Java 泛型詳解
    看完了泛型類,接下來我們來了解一下泛型方法。根據上面的例子,我們可以總結出一條規律,」Producer Extends, Consumer Super」:「Producer Extends」 – 如果你需要一個只讀List,用它來produce T,那麼使用? extends T。「Consumer Super」 – 如果你需要一個只寫List,用它來consume T,那麼使用? super T。
  • Java的「泛型」特性,你以為自己會了?(萬字長文)
    - (表示不確定的java類型)但是泛型的參數只能是類類型,不能是基本的數據類型,他的類型一定是自Object的注意:泛型不接受基本數據類型,換句話說,只有引用類型才能作為泛型方法的實際參數2. 為什麼要使用泛型?
  • Java基礎教程:Java泛型概述及應用(Java難點)
    就要把迭代出來的對象轉成String類型 String str = (String) it.next(); System.out.println(str.length()); }}}程序在運行時發生了問題java.lang.ClassCastException
  • java泛型的基本使用案例,重基礎
    持續更新中……在上幾篇圖文中已經介紹了容器集合的大部分的基本使用,接下來按照知識圖譜的順序來介紹一下java泛型的使用。在下面的例子中講創建一個繼承結構,然後用基本類型的類型來聲明容器,看看容器表現是否表現正常,並且創建一個泛型方法,來觀察對類型的處理。下面通過代碼展示:
  • Java泛型背後是什麼
    這一節主要講的內容是java中泛型的應用,通過該篇讓大家更好地理解泛型,以及面試中經常說的泛型類型擦除是什麼概念,今天就帶著這幾個問題一起看下:舉一個簡單的例子:這裡可以看出來在代碼編寫階段就已經報錯了,不能往string類型的集合中添加int類型的數據。
  • Java泛型的約束與局限性
    運行時類型查詢只適用於原始類型(raw type)運行時:通常指在Classloader裝載之後,JVM執行之時類型查詢:instanceof、getClass、強制類型轉換原始類型:即(raw type),泛型類型經編譯器類型擦除後是Object或泛型參數的限定類型(例如Pair,Comparable就是T的限定類型,轉化後泛型的原始類型就是
  • Java基礎-今日內容介紹(集合、Iterator、增強for循環 泛型)
    泛型就是需要我們指定存儲的數據類型。Java的泛型是偽泛型,編譯後的文件裡是沒有泛型的。2.Iterator迭代器知識點:java中有很多集合,但是我們不可能每個集合都去寫一個迭代器,所以,我們使用有一個通用的迭代器Iterator迭代器遍歷集合元素3.增強for循環:增強for循環,好處是代碼少,弊端是不能操作裡面的元素,比如排序啊等等。
  • 理解泛型中的in和out
    |  1.引言  |Kotlin中的泛型使用和java一樣,但如果你使用的是kotlin語言開發,你會發現kotlin的泛型會多出兩個關鍵字,分別是in和out。這兩個關鍵字經常讓人疑惑,它的字面意思是輸入和輸出,很難讓人聯想到java泛型的某個特性。實際上它們在java中是有對應關係的。
  • Java面試重要考點攻克:如何在Java中使用泛型?
    正確理解泛型對於掌握Java至關重要,這也會對你的面試有所助益。本文是關於Java中泛型知識的大放送,泛型是什麼,如何在Java中使用,以及它們的優點有哪些,你都能在下文中找到答案。在Java 5中添加泛型是為了提供編譯時類型檢查,並消除使用集合類時常見的 ClassCastException 風險。