所谓泛型,就是容许在定义类、接口时经过一个标识表示类中某个属性的类 型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如, 继承或实现这个接口,用这个类型声明变量、建立对象时)肯定(即传入实 际的类型参数,也称为类型实参)。java
从JDK1.5之后,Java引入了“参数化类型(Parameterized type)”的概念, 容许咱们在建立集合时再指定集合元素的类型,正如:List,这代表 该List只能保存字符串类型的对象。安全
JDK1.5改写了集合框架中的所有接口和类,为这些接口、类增长了泛型支持, 从而能够在声明集合变量、建立集合对象时传入类型实参。框架
在集合中使用泛型:code
add(E e)
→实例化之后:add(Integer e)
java.lang.Object类型
。在集合中使用泛型以前的状况(以ArrayList为例)对象
public void test() { ArrayList list = new ArrayList(); // 要求:存放数字 list.add(123); list.add(456); list.add(848); list.add(-485); // 问题一:类型不安全 list.add("Tom"); for (Object score : list) { // 问题二:强转时,可能出现ClassCastException异常 int stuScore = (Integer) score; System.out.println(stuScore); } }
在集合中使用泛型的状况(以ArrayList为例)继承
public void test2() { ArrayList<Integer> list = new ArrayList<Integer>(); // JDK 7新特性:类型推断 // ArrayList<Integer> list = new ArrayList<>(); list.add(85); list.add(75); list.add(15); list.add(-87); // 编译时,就会进行检查,保证数据的安全 //list.add("Tom"); // 方式一 for (Integer score : list) { // 避免了强转操做 int stuScore = score; System.out.println(stuScore); } // 方式二 Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } }
在集合中使用泛型的状况(以HashMap为例)接口
public void test3() { HashMap<String, Integer> map = new HashMap<String, Integer>(); // JDK 7新特性:类型推断 HashMap<String, Integer> map = new HashMap<>(); map.put("Tom",87); map.put("Jerry",65); map.put("Mack",87); // map.put(125,"ABC"); // 泛型的嵌套 Set<Map.Entry<String,Integer>> entry = map.entrySet(); Iterator<Map.Entry<String,Integer>> iterator = entry.iterator(); while (iterator.hasNext()) { Map.Entry<String,Integer> e = iterator.next(); String key = e.getKey(); Integer value = e.getValue(); System.out.println(key + "-----" + value); } }