泛型:能夠在類或者方法當中預支的使用未知的數據類型。java
備註:通常在建立對象的時候,將未知的數據類型肯定爲具體的數據類型,當沒有指定泛型時,默認類型爲Object類型。框架
避免了類型轉換的麻煩,存儲的是什麼樣的數據類型,取出的就是什麼樣的數據類型ide
把運行期異常(代碼運行以後會拋出異常)提高到編譯期階段(寫代碼的時候就會報錯。)測試
備註:泛型它其實也是數據類型的一部分,通常咱們將類名泛型合併一塊兒看作數據類型。code
泛型,用來靈活的將數據類型應用到不一樣的類、方法、接口當中。將數據類型做爲參數進行傳遞。對象
由於咱們的集合框架體系中,大量的使用了泛型繼承
定義格式:接口
修飾符 class 類名<表明泛型的變量>{ }
例如:ip
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