天天看點

JavaSE-泛型0.阿裡巴巴面試題

0.阿裡巴巴面試題

  1. 為什麼要使用泛型?

    泛型的好處是在編譯的時候檢查類型安全,并且所有的強制轉換都是自動和隐式的,以提高代碼的重用率。

    具體來說,将運作時期的ClassCastException,轉移到了編譯時期變成了編譯失敗;避免了類型強轉的麻煩。

  2. 泛型擦除是怎麼回事?

    簡單的說就是,類型參數隻存在于編譯期,在運作時,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. 泛型擦除的時間?

    編譯的時候進行泛型擦除。

1 泛型概述

集合預設是可以存儲任何對象的,因為任何東西放在集合,它都把他們看做Object類型。(本來就是一個box,你想裝什麼都可以,但是有一天你發現分類裝東西更友善,就需要在放之前指定類型)

JavaSE-泛型0.阿裡巴巴面試題

結果:在列印整型資料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,轉移到了編譯時期變成了編譯失敗。(是以編譯時會檢查資料類型)
  • 避免了類型強轉的麻煩。

如下:指定泛型類型後,如果放入其他類型,會提示編譯錯誤。

JavaSE-泛型0.阿裡巴巴面試題
tips:泛型是資料類型的一部分,我們将類名與泛型合并一起看做資料類型。

3 泛型的定義與使用

3.1 定義和使用含有泛型的類

修飾符 class 類名<代表泛型的變量> { }

:建立對象時确定泛型的類型

3.2 泛型方法

修飾符 <代表泛型的變量> 傳回值類型 方法名(參數){ }

:調用方法時确定泛型的類型,用于不知道方法傳回類型的時候

JavaSE-泛型0.阿裡巴巴面試題

如上所示:泛型類和泛型方法沒有關系,泛型類中的方法不一定是泛型方法,泛型方法也和類無關。各自負責各自的事情。

3.3 含有泛型的接口

修飾符 interface接口名<代表泛型的變量> { }

1、定義類時确定泛型的類型

2、始終不确定泛型的類型,直到建立對象時,确定泛型的類型

JavaSE-泛型0.阿裡巴巴面試題

繼續閱讀