JavaSE-泛型

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,你想裝什麼都可以,但是有一天你發現分類裝東西更方便,就需要在放之前指定類型)

在這裏插入圖片描述
結果:在打印整型數據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、始終不確定泛型的類型,直到創建對象時,確定泛型的類型
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章