泛型簡明解析
時間:2024-02-22 來源:華清遠見
泛型在java中有很重要的地位,無論是開源框架還是JDK源碼都能看到它。
毫不夸張的說,泛型是通用設計上必不可少的元素,所以真正理解與正確使用泛型,是一門必修課。但是出初學者想學習泛型必不可少的需要先了解集合體系
一 、Collection集合
1.1集合概述
集合:集合是java中提供的一種容器,可以用來存儲多個數據。集合和數組既然都是容器,它們有啥區別呢?
數組的長度是固定的。集合的長度是可變的。
數組中存儲的是同一類型的元素,可以存儲基本數據類型值。集合存儲的都是對象。而且對象的類 型可以不一致。在開發中一般當對象多的時候,使用集合進行存儲。
1.2集合框架
JAVASE提供了滿足各種需求的API,在使用這些API前,先了解其繼承與接口操作架構,才能了解何時采 用哪個類,以及類之間如何彼此合作,從而達到靈活應用。
集合按照其存儲結構可以分為兩大類,分別是單列集合java.util.Collection 和雙列集合
java.util.Map ,今天我們主要學習Collection 集合
從上面的描述可以看出JDK中提供了豐富的集合類庫,為了便于初學者進行系統地學習,接下來通過一張圖來描述整個集合類的繼承體系。

其中,橙色框里填寫的都是接口類型,而藍色框里填寫的都是具體的實現類。這幾天將針對圖中所列舉 的集合類進行逐一地講解。
集合本身是一個工具,它存放在java.util包中。在Collection 接口定義著單列集合框架中最最共性的內容。
1.3Collection 常用功能
Collection是所有單列集合的父接口,因此在Collection中定義了單列集合(List和Set)通用的一些方法, 這些方法可用于操作所有的單列集合。方法如下:
public boolean add(E e) : 把給定的對象添加到當前集合中 。
:清空集合中所有的元素。
public boolean remove(E e) : 把給定的對象在當前集合中刪除。public boolean contains(E e) : 判斷當前集合中是否包含給定的對象。public boolean isEmpty() : 判斷當前集合是否為空。
public int size() : 返回集合中元素的個數。
public Object[] toArray() : 把集合中的元素,存儲到數組中。
方法演示:
tips: 有關Collection中的方法可不止上面這些,其他方法可以自行查看API學習。
二、泛型
3.1泛型概述
在前面學習集合時,我們都知道集合中是可以存放任意對象的,利用Object的引用能夠參數任意化,但需要進行強制轉換,這種情況在程序運行時才回出現,是一個安全隱患。本次課討論Java中提供泛型機制來解決這種類型安全隱患的問題。
大家觀察下面代碼:
程序在運行時發生了問題java.lang.ClassCastException。為什么會發生類型轉換異常呢?
我們來分析下:由于集合中什么類型的元素都可以存儲。導致取出時強轉引發運行時
ClassCastException。怎么來解決這個問題呢?
Collection雖然可以存儲各種對象,但實際上通常Collection只存儲同一類型對象。例如都是存儲字符串 對象。因此在JDK5之后,新增了泛型(Generic)語法,讓你在設計API時可以指定類或方法支持泛型,這樣我們使用API的時候也變得更為簡潔,并得到了編譯時期的語法檢查。
泛型:可以在類或方法中預支地使用未知的類型。
tips:一般在創建對象時,將未知的類型確定具體的類型。當沒有指定泛型時,默認類型為Object
類型。
3.2使用泛型作用和應用
概念:泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。這種參數類型可以用在類、接口和方法的創建中,分別稱為泛型類、泛型接口、泛型方法。

3.3泛型的定義與使用
我們在集合中會大量使用到泛型,這里來完整地學習泛型知識。
泛型,用來靈活地將數據類型應用到不同的類、方法、接口當中。將數據類型作為參數進行傳遞。
定義和使用含有泛型的類
定義格式:
例如,API中的ArrayList集合:
使用泛型: 即什么時候確定泛型。
在創建對象的時候確定泛型
例如, ArrayList<String> list = new ArrayList<String>();
此時,變量E的值就是String類型,那么我們的類型就可以理解為:
再例如, ArrayList<Integer> list = new ArrayList<Integer>();
此時,變量E的值就是Integer類型,那么我們的類型就可以理解為:
舉例自定義泛型類
使用:
含有泛型的方法
定義格式:
例如,
使用格式:調用方法時,確定泛型的類型
含有泛型的接口
定義格式:
例如,
使用格式:
1、定義類時確定泛型的類型
例如
此時,泛型E的值就是String類型。
2、始終不確定泛型的類型,直到創建對象時,確定泛型的類型
例如
確定泛型:
3.4泛型通配符
當使用泛型類或者接口時,傳遞的數據中,泛型類型不確定,可以通過通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object類中的共性方法,集合中元素自身方法無法使用。
通配符基本使用
泛型的通配符:不知道使用什么類型來接收的時候,此時可以使用?,?表示未知通配符。此時只能接受數據,不能往該集合中存儲數據。
舉個例子大家理解使用即可:
tips:泛型不存在繼承關系 Collection list = new ArrayList();這種是錯誤的。
通配符高級使用 受限泛型
之前設置泛型的時候,實際上是可以任意設置的,只要是類就可以設置。但是在JAVA的泛型中可以指定一個泛型的上限和下限。
泛型的上限:
格式: 意義:
泛型的下限:
格式: 意義:
比如:現已知Object類,String 類,Number類,Integer類,其中Number是Integer的父類

