【006期】JavaSE面試題(六):泛型

wh7577發表於2021-09-09

開篇介紹

大家好,我是Java最全面試題庫提褲姐,今天這篇是面試系列的第六篇,主要總結了JavaSE中泛型相關面試題,在後續,會沿著第一篇開篇的知識線路一直總結下去,做到日更!如果我能做到百日百更,希望你也可以跟著百日百刷,一百天養成一個好習慣。

一、什麼是泛型?

Java泛型( generics)是JDK 5中引⼊的⼀個新特性, 允許在定義類和介面的時候使⽤型別引數( type parameter) 。
宣告的型別引數在使⽤時⽤具體的型別來替換。泛型最主要的應⽤是在JDK 5中的新集合類框架中。

泛型最⼤的好處是可以提⾼程式碼的復⽤性。以List介面為例,我們可以將String、 Integer等型別放⼊List中, 如不⽤泛型, 存放String型別要寫⼀個List介面, 存放Integer要寫另外⼀個List介面, 泛型可以很好的解決這個問題。

二、什麼是型別擦除?

過型別引數合併,將泛型型別例項關聯到同一份位元組碼上。
編譯器只為泛型型別生成一份位元組碼,並將其例項關聯到這份位元組碼上。
泛型是透過型別擦除來實現的,編譯器在編譯時擦除了所有型別相關的資訊,所以在執行時不存在任何型別相關的資訊。例如 List在執行時僅用一個List來表示。這樣做的目的,是確保能和Java 5之前的版本開發二進位制類庫進行相容。你無法在執行時訪問到型別引數,因為編譯器已經把泛型型別轉換成了原始型別。

型別擦除的主要過程如下:
1.將所有的泛型引數用其最左邊界(最頂級的父型別)型別替換。
2.移除所有的型別引數。

三、List<?> 和List的區別?

List 是一個未知型別的List,而List 其實是任意型別的List。
可以把List, List賦值給List,卻不能把List賦值給 List。

四、什麼是泛型中的限定萬用字元和非限定萬用字元 ?

限定萬用字元
對型別進行了限制。有兩種限定萬用字元:

  • 一種是它透過確保型別必須是T的子類來設定型別的上界,
  • 另一種是它透過確保型別必須是T的父類來設定型別的下界。

泛型型別必須用限定內的型別來進行初始化,否則會導致編譯錯誤。

非限定萬用字元
表示了非限定萬用字元,因為可以用任意型別來替代。

五、泛型中K T V E ?object等的含義 ?

E - Element (在集合中使用,因為集合中存放的是元素)
T - Type(Java 類)
K - Key(鍵)
V - Value(值)
N - Number(數值型別)
?- 表示不確定的java型別(無限制萬用字元型別)
Object - 是所有類的根類,任何類的物件都可以設定給該Object引用變數,使用的時候可能需要型別強制轉換,但是用使用了泛型T、E等這些識別符號後,在實際用之前型別就已經確定了,不需要再進行型別強制轉換。

六、編寫一個泛型方法,讓它能接受泛型引數並返回泛型型別 ?

public V put(K key, V value) {
   return cache.put(key, value);
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2480/viewspace-2825756/,如需轉載,請註明出處,否則將追究法律責任。

相關文章