【碼農(nóng)每日一題】Java 泛型概念相關(guān)面試題

原創(chuàng) 2017-11-21 工匠若水 碼農(nóng)每日一題


關(guān)注一下嘛,又不讓你背鍋!

問:Java 的泛型是什么?有什么好處和優(yōu)點?JDK 不同版本的泛型有什么區(qū)別?

答:泛型是 Java SE 1.5 的新特性,泛型的本質(zhì)是參數(shù)化類型,這種參數(shù)類型可以用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口、泛型方法。在 Java SE 1.5 之前沒有泛型的情況的下只能通過對類型 Object 的引用來實現(xiàn)參數(shù)的任意化,其帶來的缺點是要做顯式強制類型轉(zhuǎn)換,而這種強制轉(zhuǎn)換編譯期是不做檢查的,容易把問題留到運行時,所以 泛型的好處是在編譯時檢查類型安全,并且所有的強制轉(zhuǎn)換都是自動和隱式的,提高了代碼的重用率,避免在運行時出現(xiàn) ClassCastException。

JDK 1.5 引入了泛型來允許強類型在編譯時進行類型檢查;JDK 1.7 泛型實例化類型具備了自動推斷能力,譬如 List<String> list = new ArrayList<String>(); 可以寫成 List<String> llist = new ArrayList<>(); 了,JDK 具備自動推斷能力。下面幾種寫法可以說是不同版本的兼容性了:

//JDK 1.5 推薦使用的寫法

List<String> list =new ArrayList<String>();

//JDK 1.7 推薦使用的寫法

List<String> llist =new ArrayList<>();

//可以使用,但不推薦,是為了兼容老版本,IDE 會提示警告,可以通過注解屏蔽警告

List<String> list =new ArrayList();

//可以使用,但不推薦,是為了兼容老版本,IDE 會提示警告,可以通過注解屏蔽警告

List list =new ArrayList<String>();

問:Java 泛型是如何工作的?什么是類型擦除?

答:泛型是通過類型擦除來實現(xiàn)的,編譯器在編譯時擦除了所有泛型類型相關(guān)的信息,所以在運行時不存在任何泛型類型相關(guān)的信息,譬如 List<Integer> 在運行時僅用一個 List 來表示,這樣做的目的是為了和 Java 1.5 之前版本進行兼容。泛型擦除具體來說就是在編譯成字節(jié)碼時首先進行類型檢查,接著進行類型擦除(即所有類型參數(shù)都用他們的限定類型替換,包括類、變量和方法),接著如果類型擦除和多態(tài)性發(fā)生沖突時就在子類中生成橋方法解決,接著如果調(diào)用泛型方法的返回類型被擦除則在調(diào)用該方法時插入強制類型轉(zhuǎn)換。

問:Java 泛型類、泛型接口、泛型方法有什么區(qū)別?

答:泛型類是在實例化類的對象時才能確定的類型,其定義譬如 class Test<T> {},在實例化該類時必須指明泛型 T 的具體類型。

泛型接口與泛型類一樣,其定義譬如 interface Generator<E> { E dunc(E e); }。

泛型方法所在的類可以是泛型類也可以是非泛型類,是否擁有泛型方法與所在的類無關(guān),所以在我們應(yīng)用中應(yīng)該盡可能使用泛型方法,不要放大作用空間,尤其是在 static 方法時 static 方法無法訪問泛型類的類型參數(shù),所以更應(yīng)該使用泛型的 static 方法(聲明泛型一定要寫在 static 后返回值類型前)。泛型方法的定義譬如 <T> void func(T val) {}。

問:Java 如何優(yōu)雅的實現(xiàn)元組?

答:元組其實是關(guān)系數(shù)據(jù)庫中的一個學術(shù)名詞,一條記錄就是一個元組,一個表就是一個關(guān)系,紀錄組成表,元組生成關(guān)系,這就是關(guān)系數(shù)據(jù)庫的核心理念。很多語言天生支持元組,譬如 Python 等,在語法本身支持元組的語言中元組是用括號表示的,如 (int, bool, string) 就是一個三元組類型,不過在 Java、C 等語言中就比較坑爹,語言語法本身不具備這個特性,所以在 Java 中我們?nèi)绻雰?yōu)雅實現(xiàn)元組就可以借助泛型類實現(xiàn),如下是一個三元組類型的實現(xiàn):

Triplet<A,B,C>{

? ? private A a;

? ? private B a;

? ? private C a;

? ? public Triplet(A a,B b,C c){

? ? ? ? this.a =a;

? ? ? ? this.b =b;

? ? ? ? this.c =c;

}

}

泛型多災(zāi)多難,也是面試重災(zāi)區(qū),所以這個系列會循序漸進多篇~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原創(chuàng) 2017-11-21 工匠若水 碼農(nóng)每日一題 關(guān)注一下嘛,又不讓你背鍋! 問:Java 的泛型是什么?有什么...
    晨北北閱讀 577評論 4 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,696評論 18 399
  • 泛型是Java 1.5引入的新特性。泛型的本質(zhì)是參數(shù)化類型,這種參數(shù)類型可以用在類、變量、接口和方法的創(chuàng)建中,分別...
    何時不晚閱讀 3,117評論 0 2
  • 年初,單位不免有許多去年總結(jié),新年規(guī)劃的工作,好煩又要當眾講話了。換一種思路,把這些需要講話的工作當做一次真正的演...
    兔媽媽1503閱讀 616評論 0 3
  • 2017.3.26 晨起感恩 累計79 感恩大恩上師及諸佛菩薩的護佑和加持 感恩佛法讓我不斷反觀自己 感恩歷代...
    鵲曾閱讀 252評論 0 2

友情鏈接更多精彩內(nèi)容