0.阿里巴巴面試題
- 爲什麼要使用泛型?
泛型的好處是在編譯的時候檢查類型安全,並且所有的強制轉換都是自動和隱式的,以提高代碼的重用率。
具體來說,將運行時期的ClassCastException,轉移到了編譯時期變成了編譯失敗;避免了類型強轉的麻煩。 - 泛型擦除是怎麼回事?
簡單的說就是,類型參數只存在於編譯期,在運行時,Java 的虛擬機 ( JVM ) 並不知道泛型的存在。
public class ErasedTypeEquivalence {
public static void main(String[] args) {
Class c1 = new ArrayList<String>().getClass();
Class c2 = new ArrayList<Integer>().getClass();
System.out.println(c1 == c2);
}
}
上面的代碼有兩個不同的 ArrayList,在我們看來它們的參數化類型不同,一個保存整性,一個保存字符串。但是通過比較它們的 Class 對象,上面的代碼輸出是 true。這說明在 JVM 看來它們是同一個類。而在 C++、C# 這些支持真泛型的語言中,它們就是不同的類。
Java 泛型擦除是 Java 泛型中的一個重要特性,其目的是避免過多的創建類而造成的運行時的過度消耗
。所以,像ArrayList 和 ArrayList 這兩個實例,其類實例是同一個。
- 泛型擦除的時間?
編譯的時候進行泛型擦除。
1 泛型概述
集合默認是可以存儲任何對象的,因爲任何東西放在集合,它都把他們看做Object類型。(本來就是一個box,你想裝什麼都可以,但是有一天你發現分類裝東西更方便,就需要在放之前指定類型)
結果:在打印整型數據123時報錯。因爲你放進去的是整型,拿出來你想把它變成String。
abc
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at fanxing.Demo1.main(Demo1.java:15)
- 泛型:可以在類或方法中預支地使用未知的類型。
tips:一般在創建對象時,將未知的類型確定具體的類型。當沒有指定泛型時,默認類型爲Object類型。
2 使用泛型的好處
- 將運行時期的ClassCastException,轉移到了編譯時期變成了編譯失敗。(所以編譯時會檢查數據類型)
- 避免了類型強轉的麻煩。
如下:指定泛型類型後,如果放入其他類型,會提示編譯錯誤。
tips:泛型是數據類型的一部分,我們將類名與泛型合併一起看做數據類型。
3 泛型的定義與使用
3.1 定義和使用含有泛型的類
修飾符 class 類名<代表泛型的變量> { }
:創建對象時確定泛型的類型
3.2 泛型方法
修飾符 <代表泛型的變量> 返回值類型 方法名(參數){ }
:調用方法時確定泛型的類型,用於不知道方法返回類型的時候
如上所示:泛型類和泛型方法沒有關係,泛型類中的方法不一定是泛型方法,泛型方法也和類無關。各自負責各自的事情。
3.3 含有泛型的接口
修飾符 interface接口名<代表泛型的變量> { }
1、定義類時確定泛型的類型
2、始終不確定泛型的類型,直到創建對象時,確定泛型的類型