泛型
泛型概述
泛型:可以在類或者方法當中預支的使用未知的資料型別。
備註:一般在建立物件的時候,將未知的資料型別確定為具體的資料型別,當沒有指定泛型時,預設型別為Object型別。
使用泛型的好處
避免了型別轉換的麻煩,儲存的是什麼樣的資料型別,取出的就是什麼樣的資料型別
把執行期異常(程式碼執行之後會丟擲異常)提升到編譯期階段(寫程式碼的時候就會報錯。)
備註:泛型它其實也是資料型別的一部分,一般我們將類名泛型合併一起看做資料型別。
泛型的定義與使用
泛型,用來靈活的將資料型別應用到不同的類、方法、介面當中。將資料型別作為引數進行傳遞。
因為我們的集合框架體系中,大量的使用了泛型
定義和使用含有泛型的類
定義格式:
修飾符 class 類名<代表泛型的變數>{
}
例如:
public class ArrayList<E>{
public boolean add(E e){}
public E get(int index){}
//....
}
備註:定義的時候使用未知的泛型的變數,使用的時候(建立物件)確定的泛型的具體型別。
定義並使用含有泛型的方法
定義格式:
修飾符 <代表泛型的變數> 返回值型別 方法名(泛型引數){}
例如:
public class GenericMethod {
// 定義帶有泛型的方法
public <VIP> void show (VIP vip) {
System.out.println(vip);
}
// 定義一個含有泛型的返回值
public <VIP> VIP show02(VIP vip) {
//.....
return vip;
}
}
// 定義測試類
public class TestGenericMethod {
public static void main(String[] args){
// 建立物件
GenericMethod gm = new GenericMethod();
// 呼叫帶有泛型的方法
gm.show("abc");// VIP vip 引數 ---》形參 String str str="abc"
gm.show(123);// VIP--->Integer vip = 123
gm.show2(3.14);// VIP --->Double vip=3.14
}
}
定義並使用含有泛型的介面
定義格式:
修飾符 interface 介面名<代表泛型的變數> {}
例如:
public interface Collection<E> {
public void add(E e);
public Iterator<E> iterator();
}
// 自定義一個泛型的介面
public interface MyGenericInterface<T> {
public abstract void add(E e);
public abstract E get();
//....
}
使用格式:
-
定義實現類時可以確定泛型的型別
public class MyInterfaceImpl implements MyGenericInterface<String> { @Override public void add(String e) { //.... } @Override public String get(){ // .... } }
備註:此時泛型【T的值】就是String型別
-
始終不確定泛型的型別,直到建立物件的時候,確定泛型的型別
例如:
public class MyInterfaceImpl02<T> implements MyGenericInterface<T> {
@Override
public void add(T t) {
//....
}
@Override
public T get(){
//......
}
}
確定泛型
/*
使用泛型
*/
public class Demo04Generic {
public static void main(String[] args) {
MyInterface<String> my = new MyInterfaceImpl<String>();
my.add("abc");
}
}
泛型萬用字元 (?)
當使用泛型類或者泛型介面,傳遞的資料中,泛型的型別不確定,可以通過萬用字元<?>表示。一旦程式當中使用泛型的萬用字元後,只能使用Object類中的共性的方法,集合中元素自身方法無法使用。
萬用字元的基本使用
泛型的萬用字元:不知道使用什麼型別來接收的時候,此時可以使用?,?代表未知的萬用字元。
此時只能接收資料,不能往該集合當中儲存資料。
程式碼示例:
public static void main(String[] args) {
// 可以儲存整數的集合
Collection<Integer> list01 = new ArrayList<Integer>();
// 此時list01可以儲存整數的資料
// 展示list01集合當中的資料
getElement(list01);
// 可以儲存String字串的集合
Collection<String> list02 = new ArrayList<String>();
// 此時list02可以儲存字串的資料
getElement(list02)// Collection<Object> × 不可以
// 此時如果換成泛型萬用字元? 就可以接收
getElement(list02);// 可以
}
// 可以接收任意的資料型別
public static void getElement(Collection<?> coll){
// 只能接收Integer型別的資料
// 此時? 可以代表任意型別
}
備註:泛型不存在繼承關係 Collection