泛型是为了在限制在集合中的数据类型。将运行时的可能发生的异常转化为编译时的异常。 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){ } }