泛型是一種未知的數據類型。對象
當咱們不知道使用什麼數據類型的時候,能夠使用泛型。繼承
泛型也能夠被看做是一個變量,用來接收數據類型。接口
如:ArrayList集合在定義時,不知道集合中都會存儲什麼類型的數據,因此類型使用泛型,在建立集合對象時,就會肯定泛型的數據類型,把數據類型做爲參數傳遞賦值給泛型E。get
1).避免了類型轉換的麻煩,存儲的是什麼類型,取出就是什麼類型。編譯
2).把運行期間的異常(代碼運行以後會拋出異常)提早到了編譯期(寫代碼時就會報錯)。class
使用泛型的弊端:在使用泛型後,泛型是什麼類型,就只能存儲什麼類型的數據。泛型
能夠定義一個含有泛型的類,模擬ArrayList類。變量
定義含有方法:泛型定義在方法的修飾符以後,在返回值類型以前。List
格式:
修飾符 <泛型> 返回值類型 方法名稱 (參數列表(使用泛型)){方法體;}數據類型
含有泛型的方法在調用方法的時候肯定泛型的數據類型。
傳遞的是什麼類型的參數,泛型就是什麼類型。
含有泛型的類的第一種使用方式是定義接口的實現類,實現接口,指定接口的類型。
格式:
public interface Iterator<E>{E next();}
Scanner類實現了Iterator接口,並指定接口的泛型爲String,並重寫next方法。
public final class Scanner implments Iterator<String>{ }
含有泛型的接口的第二種使用方式:
接口使用什麼泛型,實現類就使用什麼泛型,類跟着接口走,就至關於定義了一個含有泛型的類,建立對象的時候肯定泛型的類型。
格式:
public interface List<E>{boolean add(E e);
E get(int index);}
public class ArrayList<E> implments List<E> { boolean add(E e);}
即:
第一種方式是實現類肯定泛型類型。
第二種方式是實例化肯定泛型類型。
通配符:? 表明任意的數據類型。
不知道使用什麼類型來接收時,此時能夠使用,表示未知的通配符。
此時只能接收數據,不能往該集合中存儲數據。
使用方式:
不能建立對象使用,只能做爲方法的參數使用。
注意:泛型是沒有繼承概念的,ArrayList<String>集合是不能使用ArrayList<Object>集合接收。
定義集合是不能使用泛型通配符的。
泛型的上限限定:? extends E;表明使用的泛型只能是E類型的子類/自己。
泛型的下限限定:? extends E;表明使用的泛型只能是E類型的父類/自己。
類與類之間的關係:
Integer extends Number extends Object;
String extends Object.