回顧總結14
阿新 • • 發佈:2021-08-10
泛型
泛型
之前存在的問題
- 不能對加入到集合ArrayList中的資料型別進行約束(不安全)
- 遍歷的時候,需要進行型別轉換,如果集合中的資料量較大,對效率有影響。
- 集合中是可以加入所有Object型別的元素的,不好統一管理,呼叫方法。
優點
- 編譯時,檢查新增的元素,提高了安全性
- 減少了型別轉換的次數,提高了效率
- 不再提示編譯警告
含義
泛型可看做廣泛型別,可以代表一類物件
-
泛型又稱引數化型別,是JDK5.0出現的新特性,解決資料型別的安全性問題
-
在類宣告或例項化時只要指定好需要的具體的型別即可
-
Java泛型可以保證如果程式在編譯時沒有發出警告,執行時就不會產生ClassCastException異常。同時,程式碼更加簡潔、健壯
-
泛型的作用是:可以在類宣告時通過一個標識表示類中某個屬性的型別,或是某個方法的返回值的型別,或者是引數型別
//E具體的資料型別在定義的Person物件的時候指定,即在編譯期間,就確定E是什麼型別 Person<String> person = new Person<String>(); class Person<E>{ E s;//表示s的資料型別,該資料在定義Person物件的時候指定 public Person(E s){//E也可以是引數型別 this.s = s; } public E f(){//E也可以是返回值型別 return s; } } //當新建物件的時候,可以傳進去E的具體型別 //比如String,E和String的關係類似,形參和實參。
details
- 泛型存放的只能是引用型別,不能是基本資料型別
- 指定泛型具體型別後,可以傳入子類或者實現類。多型的用法。
- 泛型使用形式
- List
list = new ArrayList (); - List
list = new ArrayList<>();簡寫推薦
- List
- 預設是使用了Object的泛型的
自定義泛型
基本語法
class 類名<T,R...>{}
detials
- 普通成員可以使用泛型(屬性、方法)
- 使用泛型的陣列,不能初始化
- 靜態方法中不能使用類的泛型
- 泛型類的型別,是在建立物件時確定的(因為建立物件時,需要指定確定型別)
- 如果在建立物件時,沒有指定型別,預設為Object
class Tiger<T,R,M>{
String name;
R r;//屬性使用泛型
M m;
T t;
public Tiger(String name,R r,M m,T t){
//構造器使用泛型
this.name = name;
this.r = r;
this.m = m;
this.t = t;
}
public R setR(){//方法使用泛型
}
}
自定義泛型類
-
T,R,M泛型的識別符號,一般是單個大寫字母
-
泛型識別符號可以有多個
-
普通成員可以使用泛型(屬性、方法)
-
使用泛型的陣列,不能初始化
泛型是在建立物件時給予,初始化是在類的載入時開闢空間(不確定空間的大小)
-
靜態方法中不能使用類的泛型
泛型是在建立物件時給予,靜態成員(屬性、方法)是在類的載入時確定,給予空間,初始化
自定義泛型介面
介面的屬性都是靜態的。不能在接口裡定義泛型屬性
使用到了泛型,但是沒有指定泛型種類的,會預設有Object,但是不易於閱讀,所以不建議省略
自定義泛型方法
修飾符<T,R...>返回型別 方法名(引數列表){}
details
- 泛型方法,可以定義在普通類中,也可以定義在泛型類中
- 當泛型方法被呼叫時,型別會確定
- public void eat(E e){}修飾符後沒有<T,R...>eat方法不是泛型方法,而是使用了泛型(泛型是不能憑空使用的,方法沒有定義泛型,只能使用類的泛型)
繼承和萬用字元
- 泛型不具備多型。不能定義父類,傳遞子類
- :支援任意泛型
- :支援A類以及A類的子類,規定了泛型的上限
- :支援A類以及A類的父類,不限於直接父類,規定了泛型的下限
JUnit
Java語言的單元測試框架
多出Java的開發環境都已經繼承了JUnit作為單元測試的工具