本博客總結網絡其他文章和自己的理解,僅用於自己鞏固基礎跟分享給大家參考而已
1.Java泛型簡介
泛型:就是一種不確定的數據類型。
比如:ArrayList<E> E就是泛型。 這種不確定的數據類型需要在使用這個類的時候才能夠確定出來。
泛型可以省略,如果省略,默認泛型是Object類型。
泛型的好處:
1. 省略了強轉的代碼。
2. 可以把運行時的問題提前到編譯時期。
2.Java泛型不能使用基本類型
java的基本類型:boolean,char,float,double,byte,int,short,long。
使用基本類型的泛型會編譯報錯,代碼如下:
List<int> list = new List<int>();// 編譯前類型檢查報錯
因爲泛型在編譯時,會進行類型擦除,最後只保留原始類型。而原始類型只能是Object類及其子類,當然不能使用基本數據類型。
3.Java泛型不允許進行靜態化
原因:靜態變量在類中共享,而泛型類型是不確定的,因此編譯器無法確定要使用的類型,所以不允許進行靜態化。
4.Java泛型不允許作爲參數進行重載
因爲類型擦除之後,兩個方法是一樣的參數列表,這種情況無法重載。
5.使用泛型的好處
使用泛型的好處:
泛型的用法是在容器後面添加<Type>
Type可以是類,抽象類,接口
泛型表示這種容器,只能存放該類類型,其他類型就放不進去了
6.子類對象是否可以放
子類對象是可以的被放入的
假設容器的泛型是A,那麼A的子類B,C都可以放進去
和A無關的類型D還是放不進去
7.泛型的簡寫
爲了不使編譯器出現警告,需要前後都使用泛型,像這樣:
ArrayList<A> a= new ArrayList<A>();
不過JDK7提供了一個可以略微減少代碼量的泛型簡寫方式:
ArrayList<A> aa= new ArrayList<>();
後面的泛型可以用<>來代替
8.泛型通配符
泛型的通配符有以下三種
1. ? extends
2. ? super
3.?
打個比喻 B,C是A的子類泛型
ArrayList lsit<? extends A> 表示這是一個A泛型或者其子類泛型
lsit的泛型可能是A
lsit的泛型可能是B
lsit的泛型可能是C
所以 可以確鑿的是,從list取出來的對象,一定是可以轉型成A的
但是,不能往裏面放東西
ArrayList list<? super A> 表示這是一個A泛型或者其父類泛型
list的泛型可能是A
list的泛型可能是Object
可以往裏面插入A以及A的子類(B,C)
但是取出來有風險,因爲不確定取出來是A還是Object
泛型通配符? 代表任意泛型
既然?代表任意泛型,那麼換句話說,這個容器什麼泛型都有可能
所以只能以Object的形式取出來
並且不能往裏面放對象,因爲不知道到底是一個什麼泛型的容器
9.泛型特性
泛型只在編譯階段有效
10.泛型的使用
泛型有三種使用方式,分別爲:泛型類、泛型接口、泛型方法
泛型類
泛型類型用於類的定義中,被稱爲泛型類。通過泛型可以完成對一組類的操作對外開放相同的接口。最典型的就是各種容器類,如:List、Set、Map。
泛型的類型參數只能是類類型,不能是簡單類型。
不能對確切的泛型類型使用instanceof操作。
泛型接口
泛型接口與泛型類的定義及使用基本相同。泛型接口常被用在各種類的生產器中。
泛型方法
在java中,泛型類的定義非常簡單,但是泛型方法就比較複雜了
泛型類,是在實例化類的時候指明泛型的具體類型;泛型方法,是在調用方法的時候指明泛型的具體類型 。
靜態方法有一種情況需要注意一下,那就是在類中的靜態方法使用泛型:靜態方法無法訪問類上定義的泛型;如果靜態方法操作
的引用數據類型不確定的時候,必須要將泛型定義在方法上。
11.泛型數組
在java中是”不能創建一個確切的泛型類型的數組”的。
也就是說下面的這個例子是不可以的
List<String>[] ls = new ArrayList<String>[10];
而使用通配符創建泛型數組是可以的,如下面這個例子:
List<?>[] ls = new ArrayList<?>[10];
這樣也是可以的:
List<String>[] ls = new ArrayList[10];