丝袜人妻一区二区三区_少妇福利无码视频_亚洲理论片在线观看_一级毛片国产A级片

當(dāng)前位置:首頁 > 汽車

【ek】Java Jenerick的通配符T、E、K、V、都明白了嗎?我都在這里總結(jié)了。

分享阿里P8首席建筑師吐血總結(jié)的《java 核心知識體系面試資料.pdf》

據(jù)說這是阿里P8級首席建筑師吐血的Java核心知識。pdf內(nèi)容廣泛,Java核心基礎(chǔ)知識、Java多線程、并發(fā)、彈簧、微服務(wù)、netty和RPC、Zookeeper、Java、

另外,還附上100克學(xué)習(xí)、面試視頻文件~

獲取方法:【傳遞關(guān)注】后,個人相信我,回復(fù)關(guān)鍵詞【資源】,可以免費獲取日常生活~

以下是資源的部分目錄和內(nèi)容屏幕截圖。

重要的再說一遍,獲取方法:【傳遞關(guān)注】后,個人相信我,回復(fù)關(guān)鍵詞【資源】即可免費獲取~

正文開始了

前言

Java泛型是JDK 5中引入的新功能,為開發(fā)人員在編譯時檢測錯誤類型提供了編譯時間類型安全檢測機制。

泛型的本質(zhì)是參數(shù)化類型。也就是說,使用的數(shù)據(jù)類型被指定為參數(shù)。

泛型的優(yōu)點

在沒有泛型的情況下,通過對類型Object的引用可以實現(xiàn)參數(shù)的“隨機化”。“任意化”的缺點是開發(fā)人員必須能夠預(yù)測實際參數(shù)類型的顯式強制類型轉(zhuǎn)換。對于強制類型轉(zhuǎn)換錯誤,編譯器在運行時可能會引發(fā)異常,而不會詢問錯誤。這本身就是安全隱患。

泛型的優(yōu)點是編譯時可以檢查類型安全性,所有強制轉(zhuǎn)換都是自動和隱式的。

公共類glmappergenerict {

Private T t

公共void set(t t){=t;}

public T get(){ return T;}

public static void main(string[]args){

//do nothing

}

/* *

*不指定類型

*/

Public void noSpecifyType(){

glmappergeneric glmappergeneric=new glmappergeneric();

Glma(“測試”);

//需要強制類型轉(zhuǎn)換

String test=(String)glma();

市(測試);

}

/* *

*指定類型

*/

Public void specifyType(){

glmappergenericstring glmappergeneric=new glmappergeneric();

Glma(“測試”);

//不需要強制類型轉(zhuǎn)換

string test=glma();

市(測試);

}

}

復(fù)制代碼

上述代碼中的specifyType方法可以刪除強制轉(zhuǎn)換,以便在編譯時檢查類型安全性,并將其用于類、方法和接口。

泛型通配符

我們在定義泛型類、泛型方法、泛型接口時,經(jīng)常遇到各種通配符,如t、e、k、v等,這些通配符是什么意思?

常用的T、E、K、V、

>

本質(zhì)上這些個都是通配符,沒啥區(qū)別,只不過是編碼時的一種約定俗成的東西。比如上述代碼中的 T ,我們可以換成 A-Z 之間的任何一個 字母都可以,并不會影響程序的正常運行,但是如果換成其他的字母代替 T ,在可讀性上可能會弱一些。通常情況下,T,E,K,V,? 是這樣約定的:

  • ? 表示不確定的 java 類型
  • T (type) 表示具體的一個java類型
  • K V (key value) 分別代表java鍵值中的Key Value
  • E (element) 代表Element

? 無界通配符

先從一個小例子看起,原文在 這里 。

我有一個父類 Animal 和幾個子類,如狗、貓等,現(xiàn)在我需要一個動物的列表,我的第一個想法是像這樣的:

List<Animal> listAnimals 復(fù)制代碼

但是老板的想法確實這樣的:

List<? extends Animal> listAnimals 復(fù)制代碼

為什么要使用通配符而不是簡單的泛型呢?通配符其實在聲明局部變量時是沒有什么意義的,但是當(dāng)你為一個方法聲明一個參數(shù)時,它是非常重要的。

static int countLegs (List<? extends Animal > animals ) { int retVal = 0; for ( Animal animal : animals ) { retVal += animal.countLegs(); } return retVal; } static int countLegs1 (List< Animal > animals ){ int retVal = 0; for ( Animal animal : animals ) { retVal += animal.countLegs(); } return retVal; } public static void main(String[] args) { List<Dog> dogs = new ArrayList<>(); // 不會報錯 countLegs( dogs ); // 報錯 countLegs1(dogs); } 復(fù)制代碼

當(dāng)調(diào)用 countLegs1 時,就會飄紅,提示的錯誤信息如下:

所以,對于不確定或者不關(guān)心實際要操作的類型,可以使用無限制通配符(尖括號里一個問號,即 <?> ),表示可以持有任何類型。像 countLegs 方法中,限定了上屆,但是不關(guān)心具體類型是什么,所以對于傳入的 Animal 的所有子類都可以支持,并且不會報錯。而 countLegs1 就不行。

上界通配符 < ? extends E>

上屆:用 extends 關(guān)鍵字聲明,表示參數(shù)化的類型可能是所指定的類型,或者是此類型的子類。

在類型參數(shù)中使用 extends 表示這個泛型中的參數(shù)必須是 E 或者 E 的子類,這樣有兩個好處:

  • 如果傳入的類型不是 E 或者 E 的子類,編譯不成功
  • 泛型中可以使用 E 的方法,要不然還得強轉(zhuǎn)成 E 才能使用
private <K extends A, E extends B> E test(K arg1, E arg2){ E result = arg2; arg2.compareTo(arg1); //..... return result; } 復(fù)制代碼

類型參數(shù)列表中如果有多個類型參數(shù)上限,用逗號分開

下界通配符 < ? super E>

下界: 用 super 進行聲明,表示參數(shù)化的類型可能是所指定的類型,或者是此類型的父類型,直至 Object

在類型參數(shù)中使用 super 表示這個泛型中的參數(shù)必須是 E 或者 E 的父類。

private <T> void test(List<? super T> dst, List<T> src){ for (T t : src) { d(t); } } public static void main(String[] args) { List<Dog> dogs = new ArrayList<>(); List<Animal> animals = new ArrayList<>(); new Test3().test(animals,dogs); } // Dog 是 Animal 的子類 class Dog extends Animal { } 復(fù)制代碼

dst 類型 “大于等于” src 的類型,這里的“大于等于”是指 dst 表示的范圍比 src 要大,因此裝得下 dst 的容器也就能裝 src 。

? 和 T 的區(qū)別

?和 T 都表示不確定的類型,區(qū)別在于我們可以對 T 進行操作,但是對 ? 不行,比如如下這種 :

// 可以 T t = operate(); // 不可以 ? car = operate(); 復(fù)制代碼

簡單總結(jié)下:

T 是一個 確定的 類型,通常用于泛型類和泛型方法的定義,?是一個 不確定 的類型,通常用于泛型方法的調(diào)用代碼和形參,不能用于定義類和泛型方法。

區(qū)別1:通過 T 來 確保 泛型參數(shù)的一致性

// 通過 T 來 確保 泛型參數(shù)的一致性 public <T extends Number> void test(List<T> dest, List<T> src) //通配符是 不確定的,所以這個方法不能保證兩個 List 具有相同的元素類型 public void test(List<? extends Number> dest, List<? extends Number> src) 復(fù)制代碼

像下面的代碼中,約定的 T 是 Number 的子類才可以,但是申明時是用的 String ,所以就會飄紅報錯。

不能保證兩個 List 具有相同的元素類型的情況

GlmapperGeneric<String> glmapperGeneric = new GlmapperGeneric<>(); List<String> dest = new ArrayList<>(); List<Number> src = new ArrayList<>(); glma(dest,src); 復(fù)制代碼

上面的代碼在編譯器并不會報錯,但是當(dāng)進入到 testNon 方法內(nèi)部操作時(比如賦值),對于 dest 和 src 而言,就還是需要進行類型轉(zhuǎn)換。

區(qū)別2:類型參數(shù)可以多重限定而通配符不行

使用 & 符號設(shè)定多重邊界(Multi Bounds),指定泛型類型 T 必須是 MultiLimitInterfaceA 和 MultiLimitInterfaceB 的共有子類型,此時變量 t 就具有了所有限定的方法和屬性。對于通配符來說,因為它不是一個確定的類型,所以不能進行多重限定。

區(qū)別3:通配符可以使用超類限定而類型參數(shù)不行

類型參數(shù) T 只具有 一種 類型限定方式:

T extends A 復(fù)制代碼

但是通配符 ? 可以進行 兩種限定:

? extends A ? super A 復(fù)制代碼

Class<T> 和 Class<?> 區(qū)別

前面介紹了 ? 和 T 的區(qū)別,那么對于,Class<T> 和 <Class<?> 又有什么區(qū)別呢?

Class<T> 和 Class<?>

最常見的是在反射場景下的使用,這里以用一段發(fā)射的代碼來說明下。

// 通過反射的方式生成 multiLimit // 對象,這里比較明顯的是,我們需要使用強制類型轉(zhuǎn)換 MultiLimit multiLimit = (MultiLimit) Cla("com.glma;).newInstance(); 復(fù)制代碼

對于上述代碼,在運行期,如果反射的類型不是 MultiLimit 類,那么一定會報 java.lang.ClassCastException 錯誤。

對于這種情況,則可以使用下面的代碼來代替,使得在在編譯期就能直接 檢查到類型的問題:

Class<T> 在實例化的時候,T 要替換成具體類。Class<?> 它是個通配泛型,? 可以代表任何類型,所以主要用于聲明時的限制情況。比如,我們可以這樣做申明:

// 可以 public Class<?> clazz; // 不可以,因為 T 需要指定類型 public Class<T> clazzT; 復(fù)制代碼

所以當(dāng)不知道定聲明什么類型的 Class 的時候可以定義一 個Class<?>。

那如果也想 public Class<T> clazzT; 這樣的話,就必須讓當(dāng)前的類也指定 T ,

public class Test3<T> { public Class<?> clazz; // 不會報錯 public Class<T> clazzT; 復(fù)制代碼

小結(jié)

本文零碎整理了下 JAVA 泛型中的一些點,不是很全,僅供參考。如果文中有不當(dāng)?shù)牡胤?,歡迎指正。

作者:glmapper

1.《【ek】Java Jenerick的通配符T、E、K、V、都明白了嗎?我都在這里總結(jié)了?!吩曰ヂ?lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《【ek】Java Jenerick的通配符T、E、K、V、都明白了嗎?我都在這里總結(jié)了?!穬H供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。

3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/auto/3071949.html

上一篇

【飛碟汽車】揭露飛碟汽車智慧工廠

下一篇

【雪佛蘭科沃茲】不足10萬的合資轎車,100公里油耗低到4.9L!雪佛蘭科沃斯怎么樣?

電腦怎么找到標(biāo)簽打印機看這里!電腦怎么安裝POSTEK(博思得)打印機

電腦怎么找到標(biāo)簽打印機看這里!電腦怎么安裝POSTEK(博思得)打印機

電腦怎么找到標(biāo)簽打印機相關(guān)介紹,POSTEK (Bostek)打印機的操作非常簡單。主要分為耗材安裝(碳標(biāo)簽)驅(qū)動安裝和打印軟件安裝。我將詳細說明具體的計算機安裝Boster打印機步驟。 1. 首先插上打印機的電源線,按下電源開關(guān) ...

【索尼液晶電視用什么屏】迷你LED屏幕,索尼XR-65X95EK電視登場,值16999韓元嗎?

  • 【索尼液晶電視用什么屏】迷你LED屏幕,索尼XR-65X95EK電視登場,值16999韓元嗎?
  • 【索尼液晶電視用什么屏】迷你LED屏幕,索尼XR-65X95EK電視登場,值16999韓元嗎?
  • 【索尼液晶電視用什么屏】迷你LED屏幕,索尼XR-65X95EK電視登場,值16999韓元嗎?
打印機怎么調(diào)循環(huán)?總結(jié)很全面速看!postek標(biāo)簽打印機連續(xù)打印怎么設(shè)置

打印機怎么調(diào)循環(huán)?總結(jié)很全面速看!postek標(biāo)簽打印機連續(xù)打印怎么設(shè)置

打印機怎么調(diào)循環(huán)相關(guān)介紹,要使用Postek標(biāo)簽打印機打印標(biāo)簽,必須在計算機上安裝該型號的打印機驅(qū)動程序,并安裝標(biāo)簽編輯軟件。 市面上有很多標(biāo)簽編輯軟件,我就拿最常見的標(biāo)簽編輯軟件Bartender來說。要打印標(biāo)簽需要先制作標(biāo)...

【大眾斯柯達】新車|價格為14.99萬韓元,上海大眾斯科達克2022號Korek上市。

  • 【大眾斯柯達】新車|價格為14.99萬韓元,上海大眾斯科達克2022號Korek上市。
  • 【大眾斯柯達】新車|價格為14.99萬韓元,上海大眾斯科達克2022號Korek上市。
  • 【大眾斯柯達】新車|價格為14.99萬韓元,上海大眾斯科達克2022號Korek上市。

打印機添加內(nèi)存條怎么設(shè)置?總結(jié)很全面速看!veket-20上配置打印機過程

  • 打印機添加內(nèi)存條怎么設(shè)置?總結(jié)很全面速看!veket-20上配置打印機過程
  • 打印機添加內(nèi)存條怎么設(shè)置?總結(jié)很全面速看!veket-20上配置打印機過程
  • 打印機添加內(nèi)存條怎么設(shè)置?總結(jié)很全面速看!veket-20上配置打印機過程
關(guān)于打印機主機的線怎么插,你需要知道這些電腦怎么安裝POSTEK(博思得)打印機

關(guān)于打印機主機的線怎么插,你需要知道這些電腦怎么安裝POSTEK(博思得)打印機

打印機主機的線怎么插相關(guān)介紹,POSTEK (Bostek)打印機的操作非常簡單。主要分為耗材安裝(碳標(biāo)簽)驅(qū)動安裝和打印軟件安裝。我將詳細說明具體的計算機安裝Boster打印機步驟。 1. 首先插上打印機的電源線,按下電源開關(guān) ...

車載導(dǎo)航自己裝軟件怎么辦?終于找到答案了持續(xù)進化只是過程,搶先體驗ZEEKR OS 3.0版本

  • 車載導(dǎo)航自己裝軟件怎么辦?終于找到答案了持續(xù)進化只是過程,搶先體驗ZEEKR OS 3.0版本
  • 車載導(dǎo)航自己裝軟件怎么辦?終于找到答案了持續(xù)進化只是過程,搶先體驗ZEEKR OS 3.0版本
  • 車載導(dǎo)航自己裝軟件怎么辦?終于找到答案了持續(xù)進化只是過程,搶先體驗ZEEKR OS 3.0版本

【貓咪玩什么牌子好】2021加拿大總餐飲行業(yè)報告:EKENA本土第二,誰是第一?

  • 【貓咪玩什么牌子好】2021加拿大總餐飲行業(yè)報告:EKENA本土第二,誰是第一?
  • 【貓咪玩什么牌子好】2021加拿大總餐飲行業(yè)報告:EKENA本土第二,誰是第一?
  • 【貓咪玩什么牌子好】2021加拿大總餐飲行業(yè)報告:EKENA本土第二,誰是第一?