泛型是爲了在限制在集合中的數據類型。將運行時的可能發生的異常轉化爲編譯時的異常。 java
例子,利用Map的泛型 spa
@Test public void test1(){ Map<String,String> map = new HashMap<String,String>(); map.put("key1","value1"); map.put("key2","value2"); map.put("key3","value3"); Set<Map.Entry<String,String>> entries = map.entrySet(); for (Map.Entry<String,String> set: entries){ String key = set.getKey(); String value = set.getValue(); print(key+" : "+ value); } }
泛型的聲明正確性 code
泛型聲明必須是引用類型,不能是基本的數據類型。 get
正常的聲明方法:若是兩邊都是用到了泛型,兩邊都必須同樣。 虛擬機
List<Person> persons = new ArrayList<Person>();
錯誤的聲明 編譯
List<Person> persons = new ArrayList<Object>(); List<Object> persons = new ArrayList<Person>();因爲要兼容歷史上沒有泛型因此容許兩邊其中有一邊沒有泛型
List<Person> persons = new ArrayList(); List persons = new ArrayList<Person>();緣由是當傳入一個不帶泛型和帶泛型方法的時候,這兩種狀況都必須兼容
public void test3(List<String> name){ } public void test4(List name){ }
泛型擦除,泛型只是檢查編譯時候的問題,而在進入java虛擬機的時候會編譯完成class中沒有了泛型。執行效率不會被影響。 class
List<E>中的E爲類型參數變量 test
List<String>中的String爲實際參數變量 效率
整個稱爲List<E>泛型類型。 泛型
整個稱爲List<String>參數化類型
泛型定義
須要先聲明再定義
static得在聲明以前<T>,這種聲明方法只在方法內有效。
public class Generic { public <T> T test(T t){ return t; } }
//這種方法能夠在類上面生聲明好全局須要用的屬性 public class Generic<S extends Integer ,Y,F> { public static <T extends String> T test(T t){ return t; } public void test2(S s,Y y,F f){ } }