泛型是在程序编码中一些包含类型参数的类型,参数只可以代表类,不能代表个别对象。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。它使程序增加了极大的效力和灵活性。不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高。
因此,泛型就是定义一种模板,例如ArrayList<T >,然后在代码中为用到的类创建对应的ArrayList<类型>:
ArrayList<String> strList = new ArrayList<String>();
这样子编译器就会针对类型作检查
这种不是我们声明的类型它就会编译错误并报错。
这样一来,既实现了编写一次,万能匹配,又通过编译器保证了类型安全:这就是泛型。
泛型可以使代码更加简洁,因为它省略了强转的代码。还可以把运行时的问题提前到编译时期,使程序更加健壮,只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常。它还具有很强的可读性和稳定性,因为他在编写集合的时候,就限定了类型。
//创建集合不给出泛型
ArrayList list = new ArrayList();
list.add("test1");
//遍历集合
for (Object obj : list){
System.out.println(obj);
}
//进行遍历,打印出每个字符串长度
for (Object obj : list) {
String str = (String) obj;/*向下转型*/
System.out.println(str.length());
}
//创建集合给出泛型
ArrayList<String> list2 = new ArrayList<>();
//添加元素
list2.add("test2");
//list2.add(100);编译时会报错,如果没有给出泛型就不会报错
//使用增强for遍历集合
for (String str2 : list2) {
System.out.println(str2);
}
// 创建ArrayList<Integer>类型:
ArrayList<Integer> integerList = new ArrayList<Integer>();
// 添加一个Integer:
integerList.add(new Integer(123));
// “向上转型”为List<Integer>:
List<Integer> integerList2 = integerList;
integerList2.add(new Integer(123));
// 从ArrayList<Integer>获取索引为1的元素(即添加的Float):
Integer n = integerList.get(1);
System.out.println(n);
结果如下: