java基礎鞏固,中級篇(泛型)

本博客總結網絡其他文章和自己的理解,僅用於自己鞏固基礎跟分享給大家參考而已

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];

 

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